IMPROVE: cho phép thay đổi instrument realtime khi đang playback
This commit is contained in:
@@ -235,7 +235,6 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
selectInstrument: async function (channel, bank, program, sfId) {
|
selectInstrument: async function (channel, bank, program, sfId) {
|
||||||
if (!_initialized || !_fluidModule) {
|
if (!_initialized || !_fluidModule) {
|
||||||
var ctx = (typeof getAudioContext === 'function') ? getAudioContext() : new (window.AudioContext || window.webkitAudioContext)();
|
var ctx = (typeof getAudioContext === 'function') ? getAudioContext() : new (window.AudioContext || window.webkitAudioContext)();
|
||||||
@@ -269,6 +268,7 @@
|
|||||||
_channels[channel].bank = bank;
|
_channels[channel].bank = bank;
|
||||||
_channels[channel].program = program;
|
_channels[channel].program = program;
|
||||||
_channels[channel].isPercussion = (bank === 128);
|
_channels[channel].isPercussion = (bank === 128);
|
||||||
|
_channels[channel].sfId = sfId;
|
||||||
},
|
},
|
||||||
|
|
||||||
controllerChange: function (channel, controller, value) {
|
controllerChange: function (channel, controller, value) {
|
||||||
@@ -407,22 +407,28 @@
|
|||||||
var self = this;
|
var self = this;
|
||||||
var doNote = function () {
|
var doNote = function () {
|
||||||
try {
|
try {
|
||||||
|
var finalBank = usedBank;
|
||||||
|
var finalProg = usedProg;
|
||||||
|
var finalSfId = synthEngine ? synthEngine.soundfont_id : undefined;
|
||||||
|
if (_channels[ch] && _channels[ch].program !== undefined) {
|
||||||
|
finalBank = _channels[ch].bank;
|
||||||
|
finalProg = _channels[ch].program;
|
||||||
|
if (_channels[ch].sfId !== undefined) {
|
||||||
|
finalSfId = _channels[ch].sfId;
|
||||||
|
}
|
||||||
|
}
|
||||||
// Program change at note time, not call time — ensures correct
|
// Program change at note time, not call time — ensures correct
|
||||||
// instrument for each item regardless of processing order.
|
// instrument for each item regardless of processing order.
|
||||||
if (synthEngine) {
|
if (synthEngine || program !== undefined) {
|
||||||
var sfHandle = synthEngine.soundfont_id ? _sfHandleMap.get(synthEngine.soundfont_id) : undefined;
|
var sfHandle = finalSfId ? _sfHandleMap.get(finalSfId) : undefined;
|
||||||
if (sfHandle !== undefined) {
|
if (sfHandle !== undefined) {
|
||||||
try {
|
try {
|
||||||
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, usedBank, usedProg);
|
_fluidModule._fluid_synth_program_select(_synthPtr, ch, sfHandle, finalBank, finalProg);
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
} else {
|
} else {
|
||||||
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, usedBank); } catch (e) {}
|
try { _fluidModule._fluid_synth_bank_select(_synthPtr, ch, finalBank); } catch (e) {}
|
||||||
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg); } catch (e) {}
|
try { _fluidModule._fluid_synth_program_change(_synthPtr, ch, finalProg); } catch (e) {}
|
||||||
}
|
}
|
||||||
} else if (program !== undefined) {
|
|
||||||
try {
|
|
||||||
_fluidModule._fluid_synth_program_change(_synthPtr, ch, usedProg);
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
}
|
||||||
console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel);
|
console.log("[SonicSF] noteOn ch:", ch, "pitch:", midiPitch, "vel:", midiVel);
|
||||||
_fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel);
|
_fluidModule._fluid_synth_noteon(_synthPtr, ch, midiPitch, midiVel);
|
||||||
|
|||||||
Reference in New Issue
Block a user