UNPKG

soundfont2

Version:

A SoundFont2 parser for Node.js and web browsers

408 lines (367 loc) 11.2 kB
import { GeneratorType } from './generator'; export enum ControllerType { /** * The controller moves linearly from the minimum to the maximum value, with the direction and * polarity specified by the modulator. */ Linear = 0, /** * The controller moves in a concave fashion from the minimum to the maximum value, with the * direction and polarity specified by the modulator. * * `output = Math.log(Math.sqrt(value ** 2) / [max value] ** 2)` */ Concave = 1, /** * The controller moves in a convex fashion from the minimum to the maximum value, with the * direction and polarity specified by the modulator. This is the same as the concave curve, but * with the start and end points reversed. */ Convex = 2, /** * The controller output is at a minimum value while the controller input moves from the minimum * to half of the maximum, after which the controller output is at a maximum. The direction and * polarity are specified by the modulator. */ Switch = 3 } export enum ControllerPolarity { /** * The controller should be mapped with a minimum value of 0 and a maximum value of 1. It behaves * similar to the modulation wheel controller of the MIDI specification. */ Unipolar = 0, /** * The controller should be mapped with a minimum value of -1 and a maximum value of 1. It * behaves similar to the pitch wheel controller of the MIDI specification. */ Bipolar = 1 } export enum ControllerDirection { /** * The direction of the controller should be from the minimum to the maximum value. */ Increasing = 0, /** * The direction of the controller should be from the maximum to the minimum value. */ Decreasing = 1 } export enum ControllerPalette { /** * Use the general controller palette as described by the `Controller` enum. */ GeneralController = 0, /** * Use the MIDI controller palette. */ MidiController = 1 } export enum Controller { /** * No controller is to be used. */ NoController = 0, /** * The controller source to be used is the velocity value which is sent from the MIDI note-on * command. */ NoteOnVelocity = 2, /** * The controller source to be used is the key number value which was sent from the MIDI note-on * command. */ NoteOnKeyNumber = 3, /** * The controller source to be used is the poly pressure amount that is sent from the MIDI * poly-pressure command. */ PolyPressure = 10, /** * The controller source to be used is the channel pressure amount that is sent from the MIDI * channel-pressure command. */ ChannelPressure = 13, /** * The controller source to be used is the pitch wheel amount which is sent from the MIDI pitch * wheel command. */ PitchWheel = 14, /** * The controller source to be used is the pitch wheel sensitivity amount which is sent from the * MIDI RPN 0 pitch wheel sensitivity command. */ PitchWheelSensitivity = 16, /** * The controller source is the output of another modulator. This is only supported as `value`, * not as `valueSource`. */ Link = 127 } export interface ControllerValue { /** * The type of modulator. */ type: ControllerType; /** * The polarity of the modulator. */ polarity: ControllerPolarity; /** * The direction of the modulator. */ direction: ControllerDirection; /** * The controller palette used for the modulator. */ palette: ControllerPalette; /** * The index of the general or MIDI controller. If the palette is set to `GeneralController`, * this refers to a type in the `Controller` type. Otherwise, its a MIDI continuous controller. */ index: Controller | number; } export enum TransformType { /** * The output value of the multiplier is fed directly to the summing node of the given * destination. */ Linear = 0, /** * The output value of the multiplier is to be the absolute value of the input value, as defined * by the relationship: * * `output = Math.sqrt(input ** 2)` or simply `output = Math.abs(input)` */ Absolute = 2 } export interface Modulator { /** * Destination generator. */ id: GeneratorType; /** * Source modulator. */ source: ControllerValue; /** * Degree of modulation. */ value: number; /** * Source controls value of first. * * TODO: Description is unclear. Should be improved. */ valueSource: ControllerValue; /** * Transform applied to source. */ transform: TransformType; } /** * The default modulators at instrument level. Implementing these is up to the consumer of this * library. To override these modulators, other modulators have to be defined explicitly. */ export const DEFAULT_INSTRUMENT_MODULATORS: Modulator[] = [ // MIDI note-on velocity to initial attenuation { id: GeneratorType.InitialAttenuation, source: { type: ControllerType.Concave, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Decreasing, palette: ControllerPalette.GeneralController, index: Controller.NoteOnVelocity }, value: 960, valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI note-on velocity to filter cutoff { id: GeneratorType.InitialFilterFc, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Decreasing, palette: ControllerPalette.GeneralController, index: Controller.NoteOnVelocity }, value: -2400, // cents valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI channel pressure to vibrato LFO pitch depth { id: GeneratorType.VibLFOToPitch, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.ChannelPressure }, value: 50, // cents / max excursion valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 1 to vibrato LFO pitch depth { id: GeneratorType.VibLFOToPitch, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.MidiController, index: 1 }, value: 50, valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 7 to initial attenuation { id: GeneratorType.InitialAttenuation, source: { type: ControllerType.Concave, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Decreasing, palette: ControllerPalette.MidiController, index: 7 }, value: 960, valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 10 to pan position { id: GeneratorType.InitialAttenuation, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Bipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.MidiController, index: 10 }, value: 1000, // tenths of a percent valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 11 to initial attenuation { id: GeneratorType.InitialAttenuation, source: { type: ControllerType.Concave, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Decreasing, palette: ControllerPalette.MidiController, index: 11 }, value: 960, valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 91 to reverb effects send { id: GeneratorType.ReverbEffectsSend, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.MidiController, index: 91 }, value: 200, // tenths of a percent valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI continuous controller 93 to chorus effects send { id: GeneratorType.ChorusEffectsSend, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.MidiController, index: 93 }, value: 200, // tenths of a percent valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.NoController }, transform: TransformType.Linear }, // MIDI pitch wheel to initial pitch controlled by MIDI pitch wheel sensitivity { id: GeneratorType.CoarseTune, source: { type: ControllerType.Linear, polarity: ControllerPolarity.Bipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.PitchWheel }, value: 12700, // cents valueSource: { type: ControllerType.Linear, polarity: ControllerPolarity.Unipolar, direction: ControllerDirection.Increasing, palette: ControllerPalette.GeneralController, index: Controller.PitchWheelSensitivity }, transform: TransformType.Linear } ];