|
|
import { |
|
|
ALL_CHANNELS_OR_DIFFERENT_ACTION, |
|
|
returnMessageType |
|
|
} from "../../synthetizer/worklet_system/message_protocol/worklet_message.js"; |
|
|
import { SongChangeType, WorkletSequencerMessageType, WorkletSequencerReturnMessageType } from "./sequencer_message.js"; |
|
|
import { messageTypes, midiControllers } from "../../midi_parser/midi_message.js"; |
|
|
|
|
|
import { MIDI_CHANNEL_COUNT } from "../../synthetizer/synth_constants.js"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function processMessage(messageType, messageData) |
|
|
{ |
|
|
switch (messageType) |
|
|
{ |
|
|
default: |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.loadNewSongList: |
|
|
this.loadNewSongList(messageData[0], messageData[1]); |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.pause: |
|
|
this.pause(); |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.play: |
|
|
this.play(messageData); |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.stop: |
|
|
this.stop(); |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.setTime: |
|
|
this.currentTime = messageData; |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.changeMIDIMessageSending: |
|
|
this.sendMIDIMessages = messageData; |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.setPlaybackRate: |
|
|
this.playbackRate = messageData; |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.setLoop: |
|
|
const [loop, count] = messageData; |
|
|
this.loop = loop; |
|
|
if (count === ALL_CHANNELS_OR_DIFFERENT_ACTION) |
|
|
{ |
|
|
this.loopCount = Infinity; |
|
|
} |
|
|
else |
|
|
{ |
|
|
this.loopCount = count; |
|
|
} |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.changeSong: |
|
|
switch (messageData[0]) |
|
|
{ |
|
|
case SongChangeType.forwards: |
|
|
this.nextSong(); |
|
|
break; |
|
|
|
|
|
case SongChangeType.backwards: |
|
|
this.previousSong(); |
|
|
break; |
|
|
|
|
|
case SongChangeType.shuffleOff: |
|
|
this.shuffleMode = false; |
|
|
this.songIndex = this.shuffledSongIndexes[this.songIndex]; |
|
|
break; |
|
|
|
|
|
case SongChangeType.shuffleOn: |
|
|
this.shuffleMode = true; |
|
|
this.shuffleSongIndexes(); |
|
|
this.songIndex = 0; |
|
|
this.loadCurrentSong(); |
|
|
break; |
|
|
|
|
|
case SongChangeType.index: |
|
|
this.songIndex = messageData[1]; |
|
|
this.loadCurrentSong(); |
|
|
break; |
|
|
} |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.getMIDI: |
|
|
this.post(WorkletSequencerReturnMessageType.getMIDI, this.midiData); |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.setSkipToFirstNote: |
|
|
this.skipToFirstNoteOn = messageData; |
|
|
break; |
|
|
|
|
|
case WorkletSequencerMessageType.setPreservePlaybackState: |
|
|
this.preservePlaybackState = messageData; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function post(messageType, messageData = undefined) |
|
|
{ |
|
|
if (!this.synth.enableEventSystem) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
this.synth.post({ |
|
|
messageType: returnMessageType.sequencerSpecific, |
|
|
messageData: { |
|
|
messageType: messageType, |
|
|
messageData: messageData |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function sendMIDIMessage(message) |
|
|
{ |
|
|
this.post(WorkletSequencerReturnMessageType.midiEvent, message); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function sendMIDICC(channel, type, value) |
|
|
{ |
|
|
channel %= 16; |
|
|
if (!this.sendMIDIMessages) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
this.sendMIDIMessage([messageTypes.controllerChange | channel, type, value]); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function sendMIDIProgramChange(channel, program) |
|
|
{ |
|
|
channel %= 16; |
|
|
if (!this.sendMIDIMessages) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
this.sendMIDIMessage([messageTypes.programChange | channel, program]); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function sendMIDIPitchWheel(channel, MSB, LSB) |
|
|
{ |
|
|
channel %= 16; |
|
|
if (!this.sendMIDIMessages) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
this.sendMIDIMessage([messageTypes.pitchBend | channel, LSB, MSB]); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function sendMIDIReset() |
|
|
{ |
|
|
if (!this.sendMIDIMessages) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
this.sendMIDIMessage([messageTypes.reset]); |
|
|
for (let ch = 0; ch < MIDI_CHANNEL_COUNT; ch++) |
|
|
{ |
|
|
this.sendMIDIMessage([messageTypes.controllerChange | ch, midiControllers.allSoundOff, 0]); |
|
|
this.sendMIDIMessage([messageTypes.controllerChange | ch, midiControllers.resetAllControllers, 0]); |
|
|
} |
|
|
} |