Files
SonicForgeStudio/app/static/js/services/pianoRollTabService.js
3dtours b42190e6bc feat: implement md/41_INSTRUMENT.md spec
- PianoRollTabService: getParentTrackByItemId, buildActiveScope,
  getTrackMidiChannel helpers
- parent_track_id on all MIDI items for reverse track lookup
- handleSwitchMidiItem uses active_scope pattern
- Toolbar shows parent track context labels
- Channel assignment simplified to trackIndex % 16
- All playNote calls use unified getTrackMidiChannel
2026-07-27 20:48:14 +07:00

44 lines
1.7 KiB
JavaScript

(function () {
'use strict';
window.SonicPianoRoll = {
getParentTrackByItemId: function (itemId, tracks) {
if (!tracks || !itemId) return null;
for (var i = 0; i < tracks.length; i++) {
var items = tracks[i].midiItems || [];
for (var j = 0; j < items.length; j++) {
if (items[j].id === itemId) return tracks[i];
}
}
return null;
},
getParentTrackIdByItemId: function (itemId, tracks) {
var trk = this.getParentTrackByItemId(itemId, tracks);
return trk ? trk.id : null;
},
buildActiveScope: function (itemId, tracks) {
var parentTrack = this.getParentTrackByItemId(itemId, tracks);
if (!parentTrack) return null;
var trackIndex = -1;
for (var i = 0; i < tracks.length; i++) {
if (tracks[i].id === parentTrack.id) { trackIndex = i; break; }
}
return {
item_id: itemId,
parent_track_id: parentTrack.id,
midi_channel: trackIndex >= 0 ? trackIndex % 16 : 0,
current_synth_engine: parentTrack.synth_engine || null,
instrument_program: parentTrack.instrumentProgram,
instrument_name: parentTrack.instrumentName
};
},
getTrackMidiChannel: function (track, tracks) {
if (track && track.midiChannel !== undefined) return track.midiChannel;
if (!track || !tracks) return 0;
for (var i = 0; i < tracks.length; i++) {
if (tracks[i].id === track.id) return i % 16;
}
return 0;
}
};
})();