@@ -74,6 +74,11 @@ Song::ChangedPositions Song::pasteColumn(size_t patternIndex, size_t trackIndex,
7474
7575NoteChangeList Song::transposeColumn (const Position & position, int semitones) const
7676{
77+ if (m_patterns.contains (0 )) {
78+ if (auto inst = m_patterns.at (0 )->instrument (position.track ); inst && inst->settings ().drumTrack ) {
79+ return {};
80+ }
81+ }
7782 return m_patterns.contains (position.pattern ) ? m_patterns.at (position.pattern )->transposeColumn (position, semitones) : NoteChangeList {};
7883}
7984
@@ -103,6 +108,11 @@ Song::ChangedPositions Song::pasteTrack(size_t patternIndex, size_t trackIndex,
103108
104109NoteChangeList Song::transposeTrack (const Position & position, int semitones) const
105110{
111+ if (m_patterns.contains (0 )) {
112+ if (auto inst = m_patterns.at (0 )->instrument (position.track ); inst && inst->settings ().drumTrack ) {
113+ return {};
114+ }
115+ }
106116 return m_patterns.contains (position.pattern ) ? m_patterns.at (position.pattern )->transposeTrack (position, semitones) : NoteChangeList {};
107117}
108118
@@ -132,7 +142,34 @@ Song::ChangedPositions Song::pastePattern(size_t patternIndex, CopyManager & cop
132142
133143NoteChangeList Song::transposePattern (const Position & position, int semitones) const
134144{
135- return m_patterns.contains (position.pattern ) ? m_patterns.at (position.pattern )->transposePattern (position, semitones) : NoteChangeList {};
145+ Pattern::DrumTracks drumTracks;
146+ const auto masterPattern = m_patterns.at (0 );
147+ for (size_t trackIndex : masterPattern->trackIndices ()) {
148+ if (auto inst = masterPattern->instrument (trackIndex); inst && inst->settings ().drumTrack ) {
149+ drumTracks.insert (trackIndex);
150+ }
151+ }
152+ return m_patterns.contains (position.pattern ) ? m_patterns.at (position.pattern )->transposePattern (position, semitones, drumTracks) : NoteChangeList {};
153+ }
154+
155+ NoteChangeList Song::transposeSong (int semitones) const
156+ {
157+ Pattern::DrumTracks drumTracks;
158+ const auto masterPattern = m_patterns.at (0 );
159+ for (size_t trackIndex : masterPattern->trackIndices ()) {
160+ if (auto inst = masterPattern->instrument (trackIndex); inst && inst->settings ().drumTrack ) {
161+ drumTracks.insert (trackIndex);
162+ }
163+ }
164+
165+ NoteChangeList changes;
166+ for (auto && [index, pattern] : m_patterns) {
167+ Position position;
168+ position.pattern = index;
169+ auto patternChanges = pattern->transposePattern (position, semitones, drumTracks);
170+ changes.insert (changes.end (), patternChanges.begin (), patternChanges.end ());
171+ }
172+ return changes;
136173}
137174
138175Song::ChangedPositions Song::cutSelection (PositionListCR positions, CopyManager & copyManager, const AutomationService & automationService) const
0 commit comments