471 lines
8.4 KiB
JavaScript
471 lines
8.4 KiB
JavaScript
import { createSlice, createEntityAdapter } from '@reduxjs/toolkit';
|
|
|
|
const defaultState = {
|
|
ids: [
|
|
'vco1',
|
|
'vco2',
|
|
'mixer1',
|
|
'pitch1',
|
|
'filter1',
|
|
'eg1',
|
|
'amp1',
|
|
'eg2',
|
|
'lfo1',
|
|
'lfo2',
|
|
'patches1',
|
|
'vco3',
|
|
'vco4',
|
|
'mixer2',
|
|
'pitch2',
|
|
'filter2',
|
|
'eg3',
|
|
'amp2',
|
|
'eg4',
|
|
'lfo3',
|
|
'lfo4',
|
|
'patches2',
|
|
'vco5',
|
|
'audioIn',
|
|
'mixer3',
|
|
'pitch3',
|
|
'filter3',
|
|
'fcMod',
|
|
'eg4',
|
|
'amp3',
|
|
'lfo5',
|
|
'lfo6',
|
|
'levels',
|
|
'pans',
|
|
'modfx',
|
|
'delay',
|
|
'eq',
|
|
'arpeggA',
|
|
'arpeggB',
|
|
'patch',
|
|
'unusedPatch',
|
|
'unusedTimbre1',
|
|
'unusedTimbre2',
|
|
'unusedVocoder',
|
|
],
|
|
entities: {
|
|
vco1: {
|
|
id: 'vco1',
|
|
waveform: 'Saw',
|
|
dwgsOrModType: 'SynWave1',
|
|
waveMod: 0,
|
|
lfoMod: 0,
|
|
},
|
|
vco2: {
|
|
id: 'vco2',
|
|
waveform: 'Saw',
|
|
dwgsOrModType: 'Off',
|
|
waveMod: 0,
|
|
lfoMod: 0,
|
|
},
|
|
vco3: {
|
|
id: 'vco3',
|
|
waveform: 'Saw',
|
|
dwgsOrModType: 'SynWave1',
|
|
waveMod: 0,
|
|
lfoMod: 0,
|
|
},
|
|
vco4: {
|
|
id: 'vco4',
|
|
waveform: 'Saw',
|
|
dwgsOrModType: 'Off',
|
|
waveMod: 0,
|
|
lfoMod: 0,
|
|
},
|
|
vco5: {
|
|
id: 'vco5',
|
|
waveform: 'Saw',
|
|
dwgsOrModType: 'SynWave1',
|
|
waveMod: 0,
|
|
lfoMod: 0,
|
|
},
|
|
audioIn: {
|
|
id: 'audioIn',
|
|
gate: 0,
|
|
threshold: 0,
|
|
hpfLevel: 0,
|
|
hpfGate: false,
|
|
},
|
|
mixer1: {
|
|
id: 'mixer1',
|
|
vol1: 127,
|
|
vol2: 0,
|
|
vol3: 0,
|
|
},
|
|
mixer2: {
|
|
id: 'mixer2',
|
|
vol1: 127,
|
|
vol2: 0,
|
|
vol3: 0,
|
|
},
|
|
mixer3: {
|
|
id: 'mixer3',
|
|
vol1: 127,
|
|
vol2: 0,
|
|
vol3: 0,
|
|
},
|
|
pitch1: {
|
|
id: 'pitch1',
|
|
voiceAssign: 'Mono',
|
|
triggerMode: 'Single',
|
|
transpose: 0,
|
|
tune: 0,
|
|
unisonDetune: 0,
|
|
portamento: 0,
|
|
bendRange: 0,
|
|
vibratoIntensity: 0,
|
|
},
|
|
pitch2: {
|
|
id: 'pitch2',
|
|
voiceAssign: 'Mono',
|
|
triggerMode: 'Single',
|
|
transpose: 0,
|
|
tune: 0,
|
|
unisonDetune: 0,
|
|
portamento: 0,
|
|
bendRange: 0,
|
|
vibratoIntensity: 0,
|
|
},
|
|
pitch3: {
|
|
id: 'pitch3',
|
|
voiceAssign: 'Mono',
|
|
triggerMode: 'Single',
|
|
transpose: 0,
|
|
tune: 0,
|
|
unisonDetune: 0,
|
|
portamento: 0,
|
|
bendRange: 0,
|
|
vibratoIntensity: 0,
|
|
},
|
|
filter1: {
|
|
id: 'filter1',
|
|
filterType: '-24db Low Pass',
|
|
cutoff: 0,
|
|
resonance: 0,
|
|
egIntensity: 0,
|
|
keyboardTrack: 0,
|
|
},
|
|
filter2: {
|
|
id: 'filter2',
|
|
filterType: '-24db Low Pass',
|
|
cutoff: 0,
|
|
resonance: 0,
|
|
egIntensity: 0,
|
|
keyboardTrack: 0,
|
|
},
|
|
filter3: {
|
|
id: 'filter3',
|
|
shift: 2,
|
|
cutoff: 0,
|
|
resonance: 0,
|
|
efSense: 0,
|
|
},
|
|
fcMod: {
|
|
id: 'fcMod',
|
|
source: 'Amp EG',
|
|
intensity: 0,
|
|
},
|
|
eg1: {
|
|
id: 'eg1',
|
|
attack: 0,
|
|
decay: 0,
|
|
sustain: 127,
|
|
release: 0,
|
|
egReset: false,
|
|
},
|
|
amp1: {
|
|
id: 'amp1',
|
|
ampLevel: 127,
|
|
panpot: 0,
|
|
ampTrack: 0,
|
|
distortion: false,
|
|
},
|
|
eg2: {
|
|
id: 'eg2',
|
|
attack: 0,
|
|
decay: 0,
|
|
sustain: 127,
|
|
release: 0,
|
|
egReset: false,
|
|
},
|
|
eg3: {
|
|
id: 'eg3',
|
|
attack: 0,
|
|
decay: 0,
|
|
sustain: 127,
|
|
release: 0,
|
|
egReset: false,
|
|
},
|
|
amp2: {
|
|
id: 'amp2',
|
|
ampLevel: 127,
|
|
panpot: 0,
|
|
ampTrack: 0,
|
|
distortion: false,
|
|
},
|
|
eg4: {
|
|
id: 'eg4',
|
|
attack: 0,
|
|
decay: 0,
|
|
sustain: 127,
|
|
release: 0,
|
|
egReset: false,
|
|
},
|
|
eg5: {
|
|
id: 'eg5',
|
|
attack: 0,
|
|
decay: 0,
|
|
sustain: 127,
|
|
release: 0,
|
|
egReset: false,
|
|
},
|
|
amp3: {
|
|
id: 'amp3',
|
|
ampLevel: 127,
|
|
directLevel: 0,
|
|
ampTrack: 0,
|
|
distortion: false,
|
|
},
|
|
lfo1: {
|
|
id: 'lfo1',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: 0,
|
|
syncNote: '1/1',
|
|
},
|
|
lfo2: {
|
|
id: 'lfo2',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: 0,
|
|
syncNote: '1/1',
|
|
},
|
|
lfo3: {
|
|
id: 'lfo3',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: 0,
|
|
syncNote: '1/1',
|
|
},
|
|
lfo4: {
|
|
id: 'lfo4',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: 0,
|
|
syncNote: '1/1',
|
|
},
|
|
lfo5: {
|
|
id: 'lfo5',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: 0,
|
|
syncNote: '1/1',
|
|
},
|
|
lfo6: {
|
|
id: 'lfo6',
|
|
waveform: 'Saw',
|
|
keySync: 'Off',
|
|
tempoSync: false,
|
|
frequency: '1/1',
|
|
},
|
|
patches1: {
|
|
id: 'patches1',
|
|
patch1: {
|
|
source: 'Filter EG',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch2: {
|
|
source: 'Filter EG',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch3: {
|
|
source: 'LFO 1',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch4: {
|
|
source: 'LFO 2',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
},
|
|
patches2: {
|
|
id: 'patches2',
|
|
patch1: {
|
|
source: 'Filter EG',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch2: {
|
|
source: 'Filter EG',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch3: {
|
|
source: 'LFO 1',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
patch4: {
|
|
source: 'LFO 2',
|
|
destination: 'Pitch',
|
|
modIntensity: 0,
|
|
},
|
|
},
|
|
levels: {
|
|
id: 'levels',
|
|
level1: 0,
|
|
level2: 0,
|
|
level3: 0,
|
|
level4: 0,
|
|
level5: 0,
|
|
level6: 0,
|
|
level7: 0,
|
|
level8: 0,
|
|
},
|
|
pans: {
|
|
id: 'pans',
|
|
pan1: 0,
|
|
pan2: 0,
|
|
pan3: 0,
|
|
pan4: 0,
|
|
pan5: 0,
|
|
pan6: 0,
|
|
pan7: 0,
|
|
pan8: 0,
|
|
},
|
|
modfx: {
|
|
id: 'modfx',
|
|
type: 'Flanger/Chorus',
|
|
lfoSpeed: 0,
|
|
effectDepth: 0,
|
|
},
|
|
delay: {
|
|
id: 'delay',
|
|
type: 'Stereo Delay',
|
|
tempoSync: false,
|
|
syncNote: '1/32',
|
|
delayTime: 0,
|
|
delayDepth: 0,
|
|
},
|
|
eq: {
|
|
id: 'eq',
|
|
lowFrequency: 40,
|
|
lowGain: 0,
|
|
highFrequency: 1.0,
|
|
highGain: 0,
|
|
},
|
|
arpeggA: {
|
|
id: 'arpeggA',
|
|
tempo: 20,
|
|
resolution: '1/24',
|
|
gate: 0,
|
|
type: 'Up',
|
|
range: 1,
|
|
},
|
|
arpeggB: {
|
|
id: 'arpeggB',
|
|
latch: false,
|
|
swing: 0,
|
|
keySync: false,
|
|
lastStep: 1,
|
|
target: 'Both',
|
|
pattern: [0, 0, 0, 0, 0, 0, 0, 0],
|
|
},
|
|
patch: {
|
|
id: 'patch',
|
|
name: 'Default',
|
|
mode: 'Single',
|
|
},
|
|
unusedPatch: {
|
|
id: 'unusedPatch',
|
|
scaleKey: 0,
|
|
scaleType: 0,
|
|
keyboardOctave: 0,
|
|
arpSwitch: 0,
|
|
},
|
|
unusedTimbre1: {
|
|
id: 'unusedTimbre1',
|
|
midiChannel: 0,
|
|
keyPriority: 0,
|
|
filterVelSense: 0,
|
|
ampSwitch: 0,
|
|
ampVelSense: 0,
|
|
},
|
|
unusedTimbre2: {
|
|
id: 'unusedTimbre2',
|
|
midiChannel: 0,
|
|
keyPriority: 0,
|
|
filterVelSense: 0,
|
|
ampSwitch: 0,
|
|
ampVelSense: 0,
|
|
},
|
|
unusedVocoder: {
|
|
id: 'unusedVocoder',
|
|
egReset2: 0,
|
|
midiChannel: 0,
|
|
keyPriority: 0,
|
|
filterEFSense: 0,
|
|
ampVelSense: 0,
|
|
eg2attack: 0,
|
|
eg2decay: 0,
|
|
eg2sustain: 0,
|
|
eg2release: 0,
|
|
},
|
|
},
|
|
unsaved: false,
|
|
activeTab: 'Timbre1',
|
|
};
|
|
|
|
const parametersAdapter = createEntityAdapter({});
|
|
|
|
const parametersSlice = createSlice({
|
|
name: 'parameters',
|
|
initialState: parametersAdapter.getInitialState(defaultState),
|
|
reducers: {
|
|
parameterUpdated(state, action) {
|
|
parametersAdapter.updateOne(state, action.payload);
|
|
state.unsaved = true;
|
|
},
|
|
parameterRefreshAll: () => defaultState,
|
|
parameterFlipUnsaved(state) {
|
|
state.unsaved = !state.unsaved;
|
|
},
|
|
parameterUpdateTab(state, action) {
|
|
state.activeTab = action.payload;
|
|
},
|
|
parameterFromFile(state, action) {
|
|
parametersAdapter.upsertMany(state, action.payload);
|
|
},
|
|
},
|
|
});
|
|
|
|
export const {
|
|
selectById,
|
|
selectAll,
|
|
selectEntities,
|
|
selectIds,
|
|
} = parametersAdapter.getSelectors((state) => state.parameters);
|
|
|
|
export const {
|
|
parameterAdded,
|
|
parameterUpdated,
|
|
parameterRefreshAll,
|
|
parameterFlipUnsaved,
|
|
parameterFromFile,
|
|
parameterUpdateTab,
|
|
} = parametersSlice.actions;
|
|
|
|
export default parametersSlice.reducer;
|