| 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]); |
| } |
| } |