feat: piano roll loads track instrument + multi-track play select

This commit is contained in:
2026-07-31 08:50:14 +07:00
parent 6c11daccf8
commit 42d64f93d8
2 changed files with 23 additions and 10 deletions
+19 -6
View File
@@ -5918,7 +5918,7 @@ const PianoRollTabEditor = ({ st, zoom, bpm, viewportWidth, activeTracks, onClos
const [showGhostNotes, setShowGhostNotes] = React.useState(true); const [showGhostNotes, setShowGhostNotes] = React.useState(true);
const [sessionSyncMode, setSessionSyncMode] = React.useState(true); const [sessionSyncMode, setSessionSyncMode] = React.useState(true);
const [activePlayTrackIds, setActivePlayTrackIds] = React.useState(null); const [activePlayTrackIds, setActivePlayTrackIds] = React.useState([]);
const allMidiItems = React.useMemo(() => { const allMidiItems = React.useMemo(() => {
const result = []; const result = [];
@@ -6422,7 +6422,7 @@ const PianoRollTabEditor = ({ st, zoom, bpm, viewportWidth, activeTracks, onClos
} }
var layers = []; var layers = [];
ghostLayers.forEach(function(layer) { ghostLayers.forEach(function(layer) {
if (activePlayTrackIds === null || activePlayTrackIds !== layer.track_id) return; if (!activePlayTrackIds || activePlayTrackIds.indexOf(layer.track_id) === -1) return;
var trk = (activeTracks || []).find(function(t) { return t.id === layer.track_id; }); var trk = (activeTracks || []).find(function(t) { return t.id === layer.track_id; });
layers.push({ layers.push({
trackId: layer.track_id, trackId: layer.track_id,
@@ -7577,13 +7577,13 @@ const beatSec = 60.0 / (parseInt(bpm) || 120);
seenTracks[m._trackId] = true; seenTracks[m._trackId] = true;
var track = (activeTracks || []).find(function(t) { return t.id === m._trackId; }); var track = (activeTracks || []).find(function(t) { return t.id === m._trackId; });
var isActive = m._trackId === st.trackId && m.id === st.target_id; var isActive = m._trackId === st.trackId && m.id === st.target_id;
var isPlayOn = activePlayTrackIds === m._trackId; var isPlayOn = activePlayTrackIds && activePlayTrackIds.indexOf(m._trackId) !== -1;
els.push(React.createElement("button", { els.push(React.createElement("button", {
key: m._trackId, key: m._trackId,
onClick: function() { onClick: function() {
if (isActive) return;
setActivePlayTrackIds(function(prev) { setActivePlayTrackIds(function(prev) {
return prev === m._trackId ? null : m._trackId; var list = prev || [];
return list.indexOf(m._trackId) !== -1 ? list.filter(function(id) { return id !== m._trackId; }) : list.concat([m._trackId]);
}); });
}, },
className: "flex items-center justify-center h-[20px] border border-zinc-600 rounded-md cursor-pointer outline-none mx-1 my-[2px] " + (isActive ? 'bg-yellow-600 text-black font-bold' : (isPlayOn ? 'bg-red-700 text-white font-semibold' : 'bg-zinc-700 text-zinc-300 hover:bg-zinc-600')) className: "flex items-center justify-center h-[20px] border border-zinc-600 rounded-md cursor-pointer outline-none mx-1 my-[2px] " + (isActive ? 'bg-yellow-600 text-black font-bold' : (isPlayOn ? 'bg-red-700 text-white font-semibold' : 'bg-zinc-700 text-zinc-300 hover:bg-zinc-600'))
@@ -11341,8 +11341,10 @@ const App = () => {
notes: midiItem.notes || [], notes: midiItem.notes || [],
duration: midiItem.duration || 4, duration: midiItem.duration || 4,
buffer: silentBuffer, buffer: silentBuffer,
instrumentProgram: track.instrumentProgram, instrumentProgram: track.instrumentProgram !== undefined ? track.instrumentProgram : (track.synth_engine ? track.synth_engine.soundfont_program : undefined),
instrumentName: track.instrumentName, instrumentName: track.instrumentName,
instrumentId: track.instrumentId,
synth_engine: track.synth_engine,
currentTime: 0, currentTime: 0,
isPlaying: false, isPlaying: false,
isLooping: true, isLooping: true,
@@ -11356,6 +11358,17 @@ const App = () => {
}; };
setSubTabs(prev => [...prev, newTab]); setSubTabs(prev => [...prev, newTab]);
setActiveTab(tabId); setActiveTab(tabId);
if (track.synth_engine && window.SonicSF && window.SonicSF.selectInstrument) {
var se = track.synth_engine;
var sfId = se.soundfont_id;
if (sfId) {
var allTrks = activeTracksRef.current || activeTracks;
var trkIdx = 0;
for (var ti = 0; ti < allTrks.length; ti++) { if (allTrks[ti].id === trackId) { trkIdx = ti; break; } }
var seCh = (se.soundfont_bank === 128 ? 9 : (trkIdx % 16));
window.SonicSF.selectInstrument(seCh, se.soundfont_bank || 0, se.soundfont_program || 0, sfId);
}
}
}; };
const handleUpdateMidiNotes = (tabId, notes) => { const handleUpdateMidiNotes = (tabId, notes) => {
File diff suppressed because one or more lines are too long