|
|
import { |
|
|
ALL_CHANNELS_OR_DIFFERENT_ACTION, |
|
|
masterParameterType, |
|
|
returnMessageType, |
|
|
workletMessageType |
|
|
} from "./worklet_message.js"; |
|
|
import { SpessaSynthLogging, SpessaSynthWarn } from "../../../utils/loggin.js"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function handleMessage(message) |
|
|
{ |
|
|
const data = message.messageData; |
|
|
const channel = message.channelNumber; |
|
|
|
|
|
|
|
|
|
|
|
let channelObject; |
|
|
if (channel >= 0) |
|
|
{ |
|
|
channelObject = this.workletProcessorChannels[channel]; |
|
|
if (channelObject === undefined) |
|
|
{ |
|
|
SpessaSynthWarn(`Trying to access channel ${channel} which does not exist... ignoring!`); |
|
|
return; |
|
|
} |
|
|
} |
|
|
switch (message.messageType) |
|
|
{ |
|
|
case workletMessageType.midiMessage: |
|
|
this.processMessage(...data); |
|
|
break; |
|
|
|
|
|
case workletMessageType.customcCcChange: |
|
|
|
|
|
channelObject.setCustomController(data[0], data[1]); |
|
|
channelObject.updateChannelTuning(); |
|
|
break; |
|
|
|
|
|
case workletMessageType.ccReset: |
|
|
if (channel === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
this.resetAllControllers(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
channelObject.resetControllers(); |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.setChannelVibrato: |
|
|
if (channel === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
for (let i = 0; i < this.workletProcessorChannels.length; i++) |
|
|
{ |
|
|
const chan = this.workletProcessorChannels[i]; |
|
|
if (data.rate === -1) |
|
|
{ |
|
|
chan.disableAndLockGSNRPN(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
chan.setVibrato(data.depth, data.rate, data.delay); |
|
|
} |
|
|
} |
|
|
} |
|
|
else if (data.rate === -1) |
|
|
{ |
|
|
channelObject.disableAndLockGSNRPN(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
channelObject.setVibrato(data.depth, data.rate, data.delay); |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.stopAll: |
|
|
if (channel === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
this.stopAllChannels(data === 1); |
|
|
} |
|
|
else |
|
|
{ |
|
|
channelObject.stopAllNotes(data === 1); |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.killNotes: |
|
|
this.voiceKilling(data); |
|
|
break; |
|
|
|
|
|
case workletMessageType.muteChannel: |
|
|
channelObject.muteChannel(data); |
|
|
break; |
|
|
|
|
|
case workletMessageType.addNewChannel: |
|
|
this.createWorkletChannel(true); |
|
|
break; |
|
|
|
|
|
case workletMessageType.debugMessage: |
|
|
this.debugMessage(); |
|
|
break; |
|
|
|
|
|
case workletMessageType.setMasterParameter: |
|
|
|
|
|
|
|
|
|
|
|
const type = data[0]; |
|
|
const value = data[1]; |
|
|
switch (type) |
|
|
{ |
|
|
case masterParameterType.masterPan: |
|
|
this.setMasterPan(value); |
|
|
break; |
|
|
|
|
|
case masterParameterType.mainVolume: |
|
|
this.setMasterGain(value); |
|
|
break; |
|
|
|
|
|
case masterParameterType.voicesCap: |
|
|
this.voiceCap = value; |
|
|
break; |
|
|
|
|
|
case masterParameterType.interpolationType: |
|
|
this.interpolationType = value; |
|
|
break; |
|
|
|
|
|
case masterParameterType.midiSystem: |
|
|
this.setSystem(value); |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.setDrums: |
|
|
channelObject.setDrums(data); |
|
|
break; |
|
|
|
|
|
case workletMessageType.transpose: |
|
|
if (channel === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
this.transposeAllChannels(data[0], data[1]); |
|
|
} |
|
|
else |
|
|
{ |
|
|
channelObject.transposeChannel(data[0], data[1]); |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.highPerformanceMode: |
|
|
this.highPerformanceMode = data; |
|
|
break; |
|
|
|
|
|
case workletMessageType.lockController: |
|
|
if (data[0] === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
channelObject.setPresetLock(data[1]); |
|
|
} |
|
|
else |
|
|
{ |
|
|
channelObject.lockedControllers[data[0]] = data[1]; |
|
|
} |
|
|
break; |
|
|
|
|
|
case workletMessageType.sequencerSpecific: |
|
|
this.sequencer.processMessage(data.messageType, data.messageData); |
|
|
break; |
|
|
|
|
|
case workletMessageType.soundFontManager: |
|
|
try |
|
|
{ |
|
|
this.soundfontManager.handleMessage(data[0], data[1]); |
|
|
} |
|
|
catch (e) |
|
|
{ |
|
|
this.post({ |
|
|
messageType: returnMessageType.soundfontError, |
|
|
messageData: e |
|
|
}); |
|
|
} |
|
|
this.clearSoundFont(true, false); |
|
|
break; |
|
|
|
|
|
case workletMessageType.keyModifierManager: |
|
|
this.keyModifierManager.handleMessage(data[0], data[1]); |
|
|
break; |
|
|
|
|
|
case workletMessageType.requestSynthesizerSnapshot: |
|
|
this.sendSynthesizerSnapshot(); |
|
|
break; |
|
|
|
|
|
case workletMessageType.setLogLevel: |
|
|
SpessaSynthLogging(data[0], data[1], data[2], data[3]); |
|
|
break; |
|
|
|
|
|
case workletMessageType.setEffectsGain: |
|
|
this.reverbGain = data[0]; |
|
|
this.chorusGain = data[1]; |
|
|
break; |
|
|
|
|
|
case workletMessageType.destroyWorklet: |
|
|
this.alive = false; |
|
|
this.destroyWorkletProcessor(); |
|
|
break; |
|
|
|
|
|
default: |
|
|
SpessaSynthWarn("Unrecognized event:", data); |
|
|
break; |
|
|
} |
|
|
} |