Project

interface Project { name: string bpm: number timeSignature: TimeSignature baseFrequency: number duration: number loop: LoopArea meta: ProjectMeta groove: GrooveShuffle output: OutputAudioUnit audioUnits: readonly AnyAudioUnit[] instrumentUnits: readonly InstrumentAudioUnit<keyof Instruments>[] auxUnits: readonly AuxAudioUnit[] groupUnits: readonly GroupAudioUnit[] markers: readonly Marker[] tempoTrack: TempoTrack signatureTrack: SignatureTrack modulators: readonly AnyModulator[] findAudioUnit(label: string): Nullable<AnyAudioUnit> addInstrumentUnit<K extends keyof Instruments>(key: K, props?: AudioUnitProps, instrument?: DeepPartial<Instruments[K]>): InstrumentAudioUnit<K> addAuxUnit(props?: BusAudioUnitProps): AuxAudioUnit addGroupUnit(props?: BusAudioUnitProps): GroupAudioUnit addMarker(props?: MarkerProps): Marker addModulator<K extends keyof Modulators>(kind: K, props?: DeepPartial<Modulators[K]>): Modulators[K] openInStudio(): void mixdown(options?: MixdownOptions): Promise<AudioData> }

A project under construction or the one open in the studio. Hand it back with Project.openInStudio


Properties

name: string

Project name

bpm: number

Tempo in bpm (30 to 1000)

timeSignature: TimeSignature

Time signature. Assign an object or set its fields

baseFrequency: number

Tuning reference in Hz (400 to 480, default 440)

duration: number

Project length in PPQN

loop: LoopArea

readonly

Loop range

meta: ProjectMeta

readonly

Project metadata

groove: GrooveShuffle

readonly

Global shuffle groove

output: OutputAudioUnit

readonly

Primary output unit

audioUnits: readonly AnyAudioUnit[]

readonly

All units ordered by index

instrumentUnits: readonly InstrumentAudioUnit<keyof Instruments>[]

readonly

Instrument units

auxUnits: readonly AuxAudioUnit[]

readonly

Auxiliary (send effect) units

groupUnits: readonly GroupAudioUnit[]

readonly

Group (bus) units

markers: readonly Marker[]

readonly

Timeline markers sorted by position

tempoTrack: TempoTrack

readonly

Tempo automation

signatureTrack: SignatureTrack

readonly

Time signature changes

modulators: readonly AnyModulator[]

readonly

All modulators ordered by index

Methods

findAudioUnit(label: string): Nullable<AnyAudioUnit>

Find a unit by its label

Parameters

  • label (string)

Returns

addInstrumentUnit< K extends keyof Instruments, >( key: K, props?: AudioUnitProps, instrument?: DeepPartial<Instruments[K]>, ): InstrumentAudioUnit<K>

Add an instrument unit. It comes with one default track matching the instrument.

Type Parameters

Parameters

  • key (K) — Instrument type
  • props (AudioUnitProps, optional) — Unit settings
  • instrument (DeepPartial<Instruments[K]>, optional) — Initial instrument parameters

Returns

Example

CODE
const synth = project.addInstrumentUnit("Vaporisateur", {label: "Lead", volume: -6}, {cutoff: 2400, resonance: 0.4})

addAuxUnit(props?: BusAudioUnitProps): AuxAudioUnit

Add an auxiliary (send effect) unit

Parameters

Returns

addGroupUnit(props?: BusAudioUnitProps): GroupAudioUnit

Add a group (bus) unit

Parameters

Returns

addMarker(props?: MarkerProps): Marker

Add a marker

Parameters

Returns

addModulator< K extends keyof Modulators, >( kind: K, props?: DeepPartial<Modulators[K]>, ): Modulators[K]

Add a modulator

Type Parameters

Parameters

  • kind (K)
  • props (DeepPartial<Modulators[K]>, optional)

Returns

Example

CODE
const steps = project.addModulator("Steps", {count: 8, rateSync: 10})
steps.setSteps([1, 0, 0.5, 0, 1, 0, 0.5, 0.25])

openInStudio(): void

Open the project in the studio (replaces the current project). Throws if the project is invalid

Returns

  • void

mixdown(options?: MixdownOptions): Promise<AudioData>

async

Render this project (including unapplied edits) to audio. Does not require openInStudio. Throws if the project is invalid

Parameters

Returns

  • Promise<AudioData>

Example

CODE
const audio = await project.mixdown()
await openDAW.saveFile(WavFile.encodeFloats(audio), `${project.name}.wav`, "audio/wav")