664 lines
22 KiB
TypeScript
664 lines
22 KiB
TypeScript
/*!*
|
|
*
|
|
* Copyright (c) Highsoft AS. All rights reserved.
|
|
*
|
|
*!*/
|
|
import * as globals from "../globals";
|
|
import * as _Highcharts from "../highcharts";
|
|
/**
|
|
* Adds the module to the imported Highcharts namespace.
|
|
*
|
|
* @param highcharts
|
|
* The imported Highcharts namespace to extend.
|
|
*/
|
|
export function factory(highcharts: typeof Highcharts): void;
|
|
declare module "../highcharts" {
|
|
/**
|
|
* Callback function for sonification events on chart.
|
|
*
|
|
* @param e
|
|
* Sonification chart event context
|
|
*/
|
|
type SonificationChartEventCallback = (e: SonificationChartEventCallbackContext) => void;
|
|
/**
|
|
* Callback function for sonification events on series.
|
|
*
|
|
* @param e
|
|
* Sonification series event context
|
|
*/
|
|
type SonificationSeriesEventCallback = (e: SonificationSeriesEventCallbackContext) => void;
|
|
type SonificationSynthPreset = ("basic1"|"basic2"|"chop"|"chord"|"flute"|"kick"|"lead"|"noise"|"piano"|"plucked"|"sawsynth"|"sawtooth"|"saxophone"|"shaker"|"shortnote"|"sine"|"square"|"step"|
|
|
"triangle"|"trumpet"|"vibraphone"|"wind"|"wobble"|"filteredNoise"|"sineGlide");
|
|
/**
|
|
* Filter callback for filtering timeline events on a SonificationTimeline.
|
|
*
|
|
* @param e
|
|
* TimelineEvent being filtered
|
|
*
|
|
* @param ix
|
|
* Index of TimelineEvent in current event array
|
|
*
|
|
* @param arr
|
|
* The current event array
|
|
*
|
|
* @return The function should return true if the TimelineEvent should be
|
|
* included, false otherwise.
|
|
*/
|
|
type SonificationTimelineFilterCallback = (e: SonificationTimelineEvent, ix: number, arr: Array<SonificationTimelineEvent>) => boolean;
|
|
interface Chart {
|
|
/**
|
|
* Sonification capabilities for the chart.
|
|
*/
|
|
sonification?: Sonification;
|
|
/**
|
|
* Play a sonification of a chart.
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
sonify(onEnd?: SonificationChartEventCallback): void;
|
|
/**
|
|
* Play/pause sonification of a chart.
|
|
*
|
|
* @param reset
|
|
* Reset the playing cursor after play completed. Defaults to
|
|
* `true`.
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
toggleSonify(reset?: boolean, onEnd?: SonificationChartEventCallback): void;
|
|
}
|
|
interface Point {
|
|
/**
|
|
* Play a sonification of a point.
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
sonify(onEnd?: SonificationChartEventCallback): void;
|
|
}
|
|
interface Series {
|
|
/**
|
|
* Play a sonification of a series.
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
sonify(onEnd?: SonificationChartEventCallback): void;
|
|
}
|
|
/**
|
|
* Event context object sent to sonification chart events.
|
|
*/
|
|
interface SonificationChartEventCallbackContext {
|
|
/**
|
|
* The relevant chart
|
|
*/
|
|
chart?: Chart;
|
|
/**
|
|
* The points that were played, if any
|
|
*/
|
|
pointsPlayed?: Array<Point>;
|
|
/**
|
|
* The playing timeline object with advanced and internal content
|
|
*/
|
|
timeline?: object;
|
|
}
|
|
/**
|
|
* Collection of Sonification classes and objects.
|
|
*/
|
|
interface SonificationGlobalObject {
|
|
/**
|
|
* SynthPatch presets
|
|
*/
|
|
InstrumentPresets?: Record<SonificationSynthPreset, SynthPatchOptionsObject>;
|
|
/**
|
|
* Musical scale presets
|
|
*/
|
|
Scales?: SonificationScalePresetsObject;
|
|
/**
|
|
* SonificationInstrument class
|
|
*/
|
|
SonificationInstrument?: SonificationInstrument;
|
|
/**
|
|
* SonificationSpeaker class
|
|
*/
|
|
SonificationSpeaker?: SonificationSpeaker;
|
|
/**
|
|
* SynthPatch class
|
|
*/
|
|
SynthPatch?: SynthPatch;
|
|
}
|
|
/**
|
|
* Capabilities configuration for a SonificationInstrument.
|
|
*/
|
|
interface SonificationInstrumentCapabilitiesOptionsObject {
|
|
/**
|
|
* Whether or not instrument should be able to use filter effects.
|
|
* Defaults to `false`.
|
|
*/
|
|
filters?: boolean;
|
|
/**
|
|
* Whether or not instrument should be able to pan. Defaults to `true`.
|
|
*/
|
|
pan?: boolean;
|
|
/**
|
|
* Whether or not instrument should be able to use tremolo effects.
|
|
* Defaults to `false`.
|
|
*/
|
|
tremolo?: boolean;
|
|
}
|
|
/**
|
|
* Configuration for a SonificationInstrument.
|
|
*/
|
|
interface SonificationInstrumentOptionsObject {
|
|
/**
|
|
* Define additional capabilities for the instrument, such as panning,
|
|
* filters, and tremolo effects.
|
|
*/
|
|
capabilities?: SonificationInstrumentCapabilitiesOptionsObject;
|
|
/**
|
|
* A track name to use for this instrument in MIDI export.
|
|
*/
|
|
midiTrackName?: string;
|
|
/**
|
|
* The synth configuration for the instrument. Can be either a string,
|
|
* referencing the instrument presets, or an actual SynthPatch
|
|
* configuration.
|
|
*/
|
|
synthPatch: (SonificationSynthPreset|SynthPatchOptionsObject);
|
|
}
|
|
/**
|
|
* Options for a scheduled event for a SonificationInstrument
|
|
*/
|
|
interface SonificationInstrumentScheduledEventOptionsObject {
|
|
/**
|
|
* Note frequency in Hertz. Overrides note, if both are given.
|
|
*/
|
|
frequency?: number;
|
|
/**
|
|
* Frequency of the highpass filter, in Hertz.
|
|
*/
|
|
highpassFreq?: number;
|
|
/**
|
|
* Resonance of the highpass filter, in dB. Can be negative for a dip,
|
|
* or positive for a bump.
|
|
*/
|
|
highpassResonance?: number;
|
|
/**
|
|
* Frequency of the lowpass filter, in Hertz.
|
|
*/
|
|
lowpassFreq?: number;
|
|
/**
|
|
* Resonance of the lowpass filter, in dB. Can be negative for a dip, or
|
|
* positive for a bump.
|
|
*/
|
|
lowpassResonance?: number;
|
|
/**
|
|
* Number of semitones from c0, or a note string - such as "c4" or
|
|
* "F#6".
|
|
*/
|
|
note?: (number|string);
|
|
/**
|
|
* Duration to play the note in milliseconds. If not given, the note
|
|
* keeps playing indefinitely
|
|
*/
|
|
noteDuration?: number;
|
|
/**
|
|
* Stereo panning value, from -1 (left) to 1 (right).
|
|
*/
|
|
pan?: number;
|
|
/**
|
|
* Depth/intensity of the tremolo effect - which is a periodic change in
|
|
* volume. From 0 to 1.
|
|
*/
|
|
tremoloDepth?: number;
|
|
/**
|
|
* Speed of the tremolo effect, from 0 to 1.
|
|
*/
|
|
tremoloSpeed?: number;
|
|
/**
|
|
* Volume of the instrument, from 0 to 1. Can be set independent of the
|
|
* master/overall volume.
|
|
*/
|
|
volume?: number;
|
|
}
|
|
/**
|
|
* Preset scales for pitch mapping.
|
|
*/
|
|
interface SonificationScalePresetsObject {
|
|
/**
|
|
* Dorian scale
|
|
*/
|
|
dorian: Array<number>;
|
|
/**
|
|
* Harmonic minor scale
|
|
*/
|
|
harmonicMinor: Array<number>;
|
|
/**
|
|
* Lydian scale
|
|
*/
|
|
lydian: Array<number>;
|
|
/**
|
|
* Major (ionian) scale
|
|
*/
|
|
major: Array<number>;
|
|
/**
|
|
* Major pentatonic scale
|
|
*/
|
|
majorPentatonic: Array<number>;
|
|
/**
|
|
* Minor scale (aeolian)
|
|
*/
|
|
minor: Array<number>;
|
|
/**
|
|
* Minor pentatonic scale
|
|
*/
|
|
minorPentatonic: Array<number>;
|
|
/**
|
|
* Mixolydian scale
|
|
*/
|
|
mixolydian: Array<number>;
|
|
/**
|
|
* Phrygian scale
|
|
*/
|
|
phrygian: Array<number>;
|
|
}
|
|
/**
|
|
* Event context object sent to sonification series events.
|
|
*/
|
|
interface SonificationSeriesEventCallbackContext {
|
|
/**
|
|
* The relevant series
|
|
*/
|
|
series?: Series;
|
|
/**
|
|
* The playing timeline object with advanced and internal content
|
|
*/
|
|
timeline?: object;
|
|
}
|
|
/**
|
|
* Configuration for a SonificationSpeaker.
|
|
*/
|
|
interface SonificationSpeakerOptionsObject {
|
|
/**
|
|
* The language of the voice synthesis. Defaults to `"en-US"`.
|
|
*/
|
|
language?: string;
|
|
/**
|
|
* Name of the voice synthesis to use. If not found, reverts to the
|
|
* default voice for the language chosen.
|
|
*/
|
|
name?: string;
|
|
/**
|
|
* The pitch modifier of the voice. Defaults to `1`. Set higher for a
|
|
* higher voice pitch.
|
|
*/
|
|
pitch?: number;
|
|
/**
|
|
* The speech rate modifier. Defaults to `1`.
|
|
*/
|
|
rate?: number;
|
|
/**
|
|
* The speech volume, from 0 to 1. Defaults to `1`.
|
|
*/
|
|
volume?: number;
|
|
}
|
|
/**
|
|
* A TimelineEvent object represents a scheduled audio event to play for a
|
|
* SonificationTimeline.
|
|
*/
|
|
interface SonificationTimelineEvent {
|
|
/**
|
|
* Callback to call when playing the event.
|
|
*/
|
|
callback?: Function;
|
|
/**
|
|
* Options for an instrument event to be played.
|
|
*/
|
|
instrumentEventOptions?: SonificationInstrumentScheduledEventOptionsObject;
|
|
/**
|
|
* The message to speak for speech events.
|
|
*/
|
|
message?: string;
|
|
/**
|
|
* A reference to a data point related to the TimelineEvent. Populated
|
|
* when sonifying points.
|
|
*/
|
|
relatedPoint?: Point;
|
|
/**
|
|
* Options for a speech event to be played.
|
|
*/
|
|
speechOptions?: SonificationSpeakerOptionsObject;
|
|
/**
|
|
* Time is given in milliseconds, where 0 is now.
|
|
*/
|
|
time: number;
|
|
}
|
|
/**
|
|
* The Sonification class. This class represents a chart's sonification
|
|
* capabilities. A chart automatically gets an instance of this class when
|
|
* applicable.
|
|
*/
|
|
class Sonification {
|
|
/**
|
|
* The Sonification class. This class represents a chart's sonification
|
|
* capabilities. A chart automatically gets an instance of this class
|
|
* when applicable.
|
|
*
|
|
* @param chart
|
|
* The chart to tie the sonification to
|
|
*/
|
|
constructor(chart: Chart);
|
|
/**
|
|
* Cancel current playing audio and reset the timeline.
|
|
*/
|
|
cancel(): void;
|
|
/**
|
|
* Start download of a MIDI file export of the timeline.
|
|
*/
|
|
downloadMIDI(): void;
|
|
/**
|
|
* Get last played point
|
|
*
|
|
* @return The point, or null if none
|
|
*/
|
|
getLastPlayedPoint(): (Point|null);
|
|
/**
|
|
* Check if sonification is playing currently
|
|
*
|
|
* @return `true` if currently playing, `false` if not
|
|
*/
|
|
isPlaying(): boolean;
|
|
/**
|
|
* Play point(s)/event(s) adjacent to current timeline cursor location.
|
|
*
|
|
* @param next
|
|
* Pass `true` to play next point, `false` for previous
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*
|
|
* @param eventFilter
|
|
* Filter to apply to the events before finding adjacent to play
|
|
*/
|
|
playAdjacent(next: number, onEnd?: SonificationChartEventCallback, eventFilter?: SonificationTimelineFilterCallback): void;
|
|
/**
|
|
* Play next/previous series, picking the point closest to a prop value
|
|
* from last played point. By default picks the point in the adjacent
|
|
* series with the closest x value as the last played point.
|
|
*
|
|
* @param next
|
|
* Pass `true` to play next series, `false` for previous
|
|
*
|
|
* @param prop
|
|
* Prop to find closest value of, defaults to `x`.
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*
|
|
* @return The played series, or `null` if none found
|
|
*/
|
|
playAdjacentSeries(next: number, prop?: string, onEnd?: SonificationChartEventCallback): (Series|null);
|
|
/**
|
|
* Play point(s)/event(s) closest to a prop relative to a reference
|
|
* value.
|
|
*
|
|
* @param prop
|
|
* Prop to compare.
|
|
*
|
|
* @param targetValue
|
|
* Target value to find closest value of.
|
|
*
|
|
* @param targetFilter
|
|
* Filter to apply to the events before finding closest point(s)
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
playClosestToProp(prop: string, targetValue: number, targetFilter?: SonificationTimelineFilterCallback, onEnd?: SonificationChartEventCallback): void;
|
|
/**
|
|
* Play a note with a specific instrument, and optionally a time offset.
|
|
*
|
|
* @param instrument
|
|
* The instrument to play. Can be either a string referencing the
|
|
* instrument presets, or an actual SynthPatch configuration.
|
|
*
|
|
* @param options
|
|
* Configuration for the instrument event to play.
|
|
*
|
|
* @param delayMs
|
|
* Time offset from now, in milliseconds. Defaults to 0.
|
|
*/
|
|
playNote(instrument: (SonificationSynthPreset|SynthPatchOptionsObject), options: SonificationInstrumentScheduledEventOptionsObject, delayMs?: number): void;
|
|
/**
|
|
* Divide timeline into 100 parts of equal time, and play one of them.
|
|
* Can be used for scrubbing navigation.
|
|
*
|
|
* @param segment
|
|
* The segment to play, from 0 to 100
|
|
*
|
|
* @param onEnd
|
|
* Callback to call after play completed
|
|
*/
|
|
playSegment(segment: number, onEnd?: SonificationChartEventCallback): void;
|
|
/**
|
|
* Set the audio destination node to something other than the default
|
|
* output. This allows for inserting custom WebAudio chains after the
|
|
* sonification.
|
|
*
|
|
* @param audioDestination
|
|
* The destination node
|
|
*/
|
|
setAudioDestination(audioDestination: AudioDestinationNode): void;
|
|
/**
|
|
* Speak a text string, optionally with a custom speaker configuration
|
|
*
|
|
* @param text
|
|
* Text to announce
|
|
*
|
|
* @param speakerOptions
|
|
* Options for the announcement
|
|
*
|
|
* @param delayMs
|
|
* Time offset from now, in milliseconds. Defaults to 0.
|
|
*/
|
|
speak(text: string, speakerOptions?: SonificationSpeakerOptionsObject, delayMs?: number): void;
|
|
}
|
|
/**
|
|
* The SonificationInstrument class. This class represents an instrument
|
|
* with mapping capabilities. The instrument wraps a SynthPatch object, and
|
|
* extends it with functionality such as panning, tremolo, and global
|
|
* low/highpass filters.
|
|
*/
|
|
class SonificationInstrument {
|
|
/**
|
|
* The SonificationInstrument class. This class represents an instrument
|
|
* with mapping capabilities. The instrument wraps a SynthPatch object,
|
|
* and extends it with functionality such as panning, tremolo, and
|
|
* global low/highpass filters.
|
|
*
|
|
* @param audioContext
|
|
* The AudioContext to use.
|
|
*
|
|
* @param outputNode
|
|
* The destination node to connect to.
|
|
*
|
|
* @param options
|
|
* Configuration for the instrument.
|
|
*/
|
|
constructor(audioContext: AudioContext, outputNode: AudioNode, options: SonificationInstrumentOptionsObject);
|
|
/**
|
|
* Cancel currently playing sounds and any scheduled actions.
|
|
*/
|
|
cancel(): void;
|
|
/**
|
|
* Stop instrument and destroy it, cleaning up used resources.
|
|
*/
|
|
destroy(): void;
|
|
/**
|
|
* Convert a note value to a frequency.
|
|
*
|
|
* @param note
|
|
* Note to convert. Can be a string 'c0' to 'b8' or a number of
|
|
* semitones from c0.
|
|
*
|
|
* @return The converted frequency
|
|
*/
|
|
musicalNoteToFrequency(note: (number|string)): number;
|
|
/**
|
|
* Schedule an instrument event at a given time offset, whether it is
|
|
* playing a note or changing the parameters of the instrument.
|
|
*
|
|
* @param time
|
|
* Time is given in seconds, where 0 is now.
|
|
*
|
|
* @param params
|
|
* Parameters for the instrument event.
|
|
*/
|
|
scheduleEventAtTime(time: number, params: SonificationInstrumentScheduledEventOptionsObject): void;
|
|
/**
|
|
* Set the overall volume.
|
|
*
|
|
* @param volume
|
|
* The volume to set, from 0 to 1.
|
|
*/
|
|
setMasterVolume(volume: number): void;
|
|
/**
|
|
* Schedule silencing the instrument at a given time offset.
|
|
*
|
|
* @param time
|
|
* Time is given in seconds, where 0 is now.
|
|
*/
|
|
silenceAtTime(time: number): void;
|
|
}
|
|
/**
|
|
* The SonificationSpeaker class. This class represents an announcer using
|
|
* speech synthesis. It allows for scheduling speech announcements, as well
|
|
* as speech parameter changes - including rate, volume and pitch.
|
|
*/
|
|
class SonificationSpeaker {
|
|
/**
|
|
* The SonificationSpeaker class. This class represents an announcer
|
|
* using speech synthesis. It allows for scheduling speech
|
|
* announcements, as well as speech parameter changes - including rate,
|
|
* volume and pitch.
|
|
*
|
|
* @param options
|
|
* Configuration for the speaker
|
|
*/
|
|
constructor(options: SonificationSpeakerOptionsObject);
|
|
/**
|
|
* Clear scheduled announcements, and stop current speech.
|
|
*/
|
|
cancel(): void;
|
|
/**
|
|
* Say a message using the speaker voice. Interrupts other currently
|
|
* speaking announcements from this speaker.
|
|
*
|
|
* @param message
|
|
* The message to speak.
|
|
*
|
|
* @param options
|
|
* Optionally override speaker configuration.
|
|
*/
|
|
say(message: string, options?: SonificationSpeakerOptionsObject): void;
|
|
/**
|
|
* Schedule a message using the speaker voice.
|
|
*
|
|
* @param time
|
|
* The time offset to speak at, in milliseconds from now.
|
|
*
|
|
* @param message
|
|
* The message to speak.
|
|
*
|
|
* @param options
|
|
* Optionally override speaker configuration.
|
|
*/
|
|
sayAtTime(time: number, message: string, options?: SonificationSpeakerOptionsObject): void;
|
|
/**
|
|
* Set speaker overall/master volume modifier. This affects all
|
|
* announcements, and applies in addition to the individual announcement
|
|
* volume.
|
|
*
|
|
* @param vol
|
|
* Volume from 0 to 1.
|
|
*/
|
|
setMasterVolume(vol: number): void;
|
|
}
|
|
/**
|
|
* The SynthPatch class. This class represents an instance and configuration
|
|
* of the built-in Highcharts synthesizer. It can be used to play various
|
|
* generated sounds.
|
|
*/
|
|
class SynthPatch {
|
|
/**
|
|
* The SynthPatch class. This class represents an instance and
|
|
* configuration of the built-in Highcharts synthesizer. It can be used
|
|
* to play various generated sounds.
|
|
*
|
|
* @param audioContext
|
|
* The AudioContext to use.
|
|
*
|
|
* @param options
|
|
* Configuration for the synth.
|
|
*/
|
|
constructor(audioContext: AudioContext, options: SynthPatchOptionsObject);
|
|
/**
|
|
* Cancel any scheduled actions
|
|
*/
|
|
cancelScheduled(): void;
|
|
/**
|
|
* Connect the SynthPatch output to an audio node / destination.
|
|
*
|
|
* @param destinationNode
|
|
* The node to connect to.
|
|
*
|
|
* @return The destination node, to allow chaining.
|
|
*/
|
|
connect(destinationNode: AudioNode): AudioNode;
|
|
/**
|
|
* Mute sound immediately.
|
|
*/
|
|
mute(): void;
|
|
/**
|
|
* Mute sound at time (in seconds). Will still run release envelope.
|
|
* Note: If scheduled multiple times in succession, the release envelope
|
|
* will run, and that could make sound.
|
|
*
|
|
* @param time
|
|
* Time offset from now, in seconds
|
|
*/
|
|
silenceAtTime(time: number): void;
|
|
/**
|
|
* Play a frequency at time (in seconds). Time denotes when the attack
|
|
* ramp starts. Note duration is given in milliseconds. If note duration
|
|
* is not given, the note plays indefinitely.
|
|
*
|
|
* @param time
|
|
* Time offset from now, in seconds
|
|
*
|
|
* @param frequency
|
|
* The frequency to play at
|
|
*
|
|
* @param noteDuration
|
|
* Duration to play, in milliseconds
|
|
*/
|
|
silenceAtTime(time: number, frequency: number, noteDuration: (number|undefined)): void;
|
|
/**
|
|
* Start the oscillators, but don't output sound.
|
|
*/
|
|
startSilently(): void;
|
|
/**
|
|
* Stop the synth. It can't be started again.
|
|
*/
|
|
stop(): void;
|
|
}
|
|
/**
|
|
* Global Sonification classes and objects.
|
|
*/
|
|
let sonification: SonificationGlobalObject;
|
|
}
|
|
export default factory;
|
|
export let Highcharts: typeof _Highcharts;
|