| |
| |
| |
| export const generatorTypes = { |
| INVALID: -1, |
| startAddrsOffset: 0, |
| endAddrOffset: 1, |
| startloopAddrsOffset: 2, |
| endloopAddrsOffset: 3, |
| startAddrsCoarseOffset: 4, |
| modLfoToPitch: 5, |
| vibLfoToPitch: 6, |
| modEnvToPitch: 7, |
| initialFilterFc: 8, |
| initialFilterQ: 9, |
| modLfoToFilterFc: 10, |
| modEnvToFilterFc: 11, |
| endAddrsCoarseOffset: 12, |
| modLfoToVolume: 13, |
| unused1: 14, |
| chorusEffectsSend: 15, |
| reverbEffectsSend: 16, |
| pan: 17, |
| unused2: 18, |
| unused3: 19, |
| unused4: 20, |
| delayModLFO: 21, |
| freqModLFO: 22, |
| delayVibLFO: 23, |
| freqVibLFO: 24, |
| delayModEnv: 25, |
| attackModEnv: 26, |
| holdModEnv: 27, |
| decayModEnv: 28, |
| sustainModEnv: 29, |
| releaseModEnv: 30, |
| keyNumToModEnvHold: 31, |
| keyNumToModEnvDecay: 32, |
| delayVolEnv: 33, |
| attackVolEnv: 34, |
| holdVolEnv: 35, |
| decayVolEnv: 36, |
| sustainVolEnv: 37, |
| releaseVolEnv: 38, |
| keyNumToVolEnvHold: 39, |
| keyNumToVolEnvDecay: 40, |
| instrument: 41, |
| reserved1: 42, |
| keyRange: 43, |
| velRange: 44, |
| startloopAddrsCoarseOffset: 45, |
| keyNum: 46, |
| velocity: 47, |
| initialAttenuation: 48, |
| reserved2: 49, |
| endloopAddrsCoarseOffset: 50, |
| coarseTune: 51, |
| fineTune: 52, |
| sampleID: 53, |
| sampleModes: 54, |
| reserved3: 55, |
| scaleTuning: 56, |
| exclusiveClass: 57, |
| overridingRootKey: 58, |
| unused5: 59, |
| endOper: 60 |
| }; |
| |
| |
| |
| export const generatorLimits = []; |
| |
| generatorLimits[generatorTypes.startAddrsOffset] = { min: 0, max: 32768, def: 0 }; |
| generatorLimits[generatorTypes.endAddrOffset] = { min: -32768, max: 32768, def: 0 }; |
| generatorLimits[generatorTypes.startloopAddrsOffset] = { min: -32768, max: 32768, def: 0 }; |
| generatorLimits[generatorTypes.endloopAddrsOffset] = { min: -32768, max: 32768, def: 0 }; |
| generatorLimits[generatorTypes.startAddrsCoarseOffset] = { min: 0, max: 32768, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.modLfoToPitch] = { min: -12000, max: 12000, def: 0 }; |
| generatorLimits[generatorTypes.vibLfoToPitch] = { min: -12000, max: 12000, def: 0 }; |
| generatorLimits[generatorTypes.modEnvToPitch] = { min: -12000, max: 12000, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.initialFilterFc] = { min: 1500, max: 13500, def: 13500 }; |
| generatorLimits[generatorTypes.initialFilterQ] = { min: 0, max: 960, def: 0 }; |
| generatorLimits[generatorTypes.modLfoToFilterFc] = { min: -12000, max: 12000, def: 0 }; |
| generatorLimits[generatorTypes.modEnvToFilterFc] = { min: -12000, max: 12000, def: 0 }; |
|
|
| generatorLimits[generatorTypes.endAddrsCoarseOffset] = { min: -32768, max: 32768, def: 0 }; |
|
|
| generatorLimits[generatorTypes.modLfoToVolume] = { min: -960, max: 960, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.chorusEffectsSend] = { min: 0, max: 1000, def: 0 }; |
| generatorLimits[generatorTypes.reverbEffectsSend] = { min: 0, max: 1000, def: 0 }; |
| generatorLimits[generatorTypes.pan] = { min: -500, max: 500, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.delayModLFO] = { min: -12000, max: 5000, def: -12000 }; |
| generatorLimits[generatorTypes.freqModLFO] = { min: -16000, max: 4500, def: 0 }; |
| generatorLimits[generatorTypes.delayVibLFO] = { min: -12000, max: 5000, def: -12000 }; |
| generatorLimits[generatorTypes.freqVibLFO] = { min: -16000, max: 4500, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.delayModEnv] = { min: -32768, max: 5000, def: -32768 }; |
| |
| generatorLimits[generatorTypes.attackModEnv] = { min: -32768, max: 8000, def: -32768 }; |
| generatorLimits[generatorTypes.holdModEnv] = { min: -12000, max: 5000, def: -12000 }; |
| generatorLimits[generatorTypes.decayModEnv] = { min: -12000, max: 8000, def: -12000 }; |
| generatorLimits[generatorTypes.sustainModEnv] = { min: 0, max: 1000, def: 0 }; |
| generatorLimits[generatorTypes.releaseModEnv] = { min: -7200, max: 8000, def: -12000 }; |
| |
| generatorLimits[generatorTypes.keyNumToModEnvHold] = { min: -1200, max: 1200, def: 0 }; |
| generatorLimits[generatorTypes.keyNumToModEnvDecay] = { min: -1200, max: 1200, def: 0 }; |
|
|
| |
| generatorLimits[generatorTypes.delayVolEnv] = { min: -12000, max: 5000, def: -12000 }; |
| generatorLimits[generatorTypes.attackVolEnv] = { min: -12000, max: 8000, def: -12000 }; |
| generatorLimits[generatorTypes.holdVolEnv] = { min: -12000, max: 5000, def: -12000 }; |
| generatorLimits[generatorTypes.decayVolEnv] = { min: -12000, max: 8000, def: -12000 }; |
| generatorLimits[generatorTypes.sustainVolEnv] = { min: 0, max: 1440, def: 0 }; |
| generatorLimits[generatorTypes.releaseVolEnv] = { min: -7200, max: 8000, def: -12000 }; |
| |
| generatorLimits[generatorTypes.keyNumToVolEnvHold] = { min: -1200, max: 1200, def: 0 }; |
| generatorLimits[generatorTypes.keyNumToVolEnvDecay] = { min: -1200, max: 1200, def: 0 }; |
|
|
| generatorLimits[generatorTypes.startloopAddrsCoarseOffset] = { min: -32768, max: 32768, def: 0 }; |
| generatorLimits[generatorTypes.keyNum] = { min: -1, max: 127, def: -1 }; |
| generatorLimits[generatorTypes.velocity] = { min: -1, max: 127, def: -1 }; |
|
|
| generatorLimits[generatorTypes.initialAttenuation] = { min: 0, max: 1440, def: 0 }; |
|
|
| generatorLimits[generatorTypes.endloopAddrsCoarseOffset] = { min: -32768, max: 32768, def: 0 }; |
|
|
| generatorLimits[generatorTypes.coarseTune] = { min: -120, max: 120, def: 0 }; |
| generatorLimits[generatorTypes.fineTune] = { min: -12700, max: 12700, def: 0 }; |
| generatorLimits[generatorTypes.scaleTuning] = { min: 0, max: 1200, def: 100 }; |
| generatorLimits[generatorTypes.exclusiveClass] = { min: 0, max: 99999, def: 0 }; |
| generatorLimits[generatorTypes.overridingRootKey] = { min: 0 - 1, max: 127, def: -1 }; |
| generatorLimits[generatorTypes.sampleModes] = { min: 0, max: 3, def: 0 }; |
|
|
| export class Generator |
| { |
| |
| |
| |
| |
| generatorType = generatorTypes.INVALID; |
| |
| |
| |
| |
| generatorValue = 0; |
| |
| |
| |
| |
| |
| |
| |
| constructor(type = generatorTypes.INVALID, value = 0, validate = true) |
| { |
| this.generatorType = type; |
| if (value === undefined) |
| { |
| throw new Error("No value provided."); |
| } |
| this.generatorValue = Math.round(value); |
| if (validate) |
| { |
| const lim = generatorLimits[type]; |
| |
| if (lim !== undefined) |
| { |
| this.generatorValue = Math.max(lim.min, Math.min(lim.max, this.generatorValue)); |
| } |
| } |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function addAndClampGenerator(generatorType, presetGens, instrumentGens) |
| { |
| const limits = generatorLimits[generatorType] || { min: 0, max: 32768, def: 0 }; |
| let presetGen = presetGens.find(g => g.generatorType === generatorType); |
| let presetValue = 0; |
| if (presetGen) |
| { |
| presetValue = presetGen.generatorValue; |
| } |
| |
| let instruGen = instrumentGens.find(g => g.generatorType === generatorType); |
| let instruValue = limits.def; |
| if (instruGen) |
| { |
| instruValue = instruGen.generatorValue; |
| } |
| |
| let value = instruValue + presetValue; |
| |
| |
| |
| |
| if (generatorType === generatorTypes.initialAttenuation) |
| { |
| return value; |
| } |
| |
| return Math.max(limits.min, Math.min(limits.max, value)); |
| } |