@opendaw/studio-core 0.0.59 → 0.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AudioOfflineRenderer.d.ts +2 -2
- package/dist/AudioOfflineRenderer.d.ts.map +1 -1
- package/dist/AudioOfflineRenderer.js +9 -9
- package/dist/AudioUtils.d.ts +4 -0
- package/dist/AudioUtils.d.ts.map +1 -0
- package/dist/AudioUtils.js +20 -0
- package/dist/EffectBox.d.ts +2 -2
- package/dist/EffectBox.d.ts.map +1 -1
- package/dist/EffectFactories.d.ts +3 -0
- package/dist/EffectFactories.d.ts.map +1 -1
- package/dist/EffectFactories.js +17 -3
- package/dist/Engine.d.ts +1 -1
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +1 -1
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +1 -1
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +7 -8
- package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
- package/dist/Preferences.d.ts +4 -0
- package/dist/Preferences.d.ts.map +1 -1
- package/dist/Preferences.js +2 -0
- package/dist/RecordingWorklet.d.ts +2 -1
- package/dist/RecordingWorklet.d.ts.map +1 -1
- package/dist/WavFile.d.ts +4 -7
- package/dist/WavFile.d.ts.map +1 -1
- package/dist/WavFile.js +22 -21
- package/dist/Workers.d.ts +2 -0
- package/dist/Workers.d.ts.map +1 -1
- package/dist/Workers.js +11 -0
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +0 -2
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +3 -1
- package/dist/cloud/CloudBackupProjects.js +4 -4
- package/dist/cloud/CloudBackupSamples.d.ts.map +1 -1
- package/dist/cloud/CloudBackupSamples.js +3 -9
- package/dist/cloud/CloudBackupSoundfonts.js +1 -1
- package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
- package/dist/dawproject/DawProjectExporter.js +2 -12
- package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
- package/dist/dawproject/DawProjectImporter.js +5 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/midi/MIDIReceiver.d.ts +12 -0
- package/dist/midi/MIDIReceiver.d.ts.map +1 -0
- package/dist/midi/MIDIReceiver.js +65 -0
- package/dist/midi/MidiDevices.d.ts +4 -1
- package/dist/midi/MidiDevices.d.ts.map +1 -1
- package/dist/midi/MidiDevices.js +40 -1
- package/dist/processors.js +17 -19
- package/dist/processors.js.map +4 -4
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +14 -2
- package/dist/project/ProjectApi.d.ts +13 -4
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +71 -29
- package/dist/project/ProjectBundle.d.ts +2 -2
- package/dist/project/ProjectBundle.d.ts.map +1 -1
- package/dist/project/ProjectBundle.js +3 -3
- package/dist/project/ProjectMeta.d.ts +2 -0
- package/dist/project/ProjectMeta.d.ts.map +1 -1
- package/dist/project/ProjectMeta.js +1 -0
- package/dist/project/ProjectMigration.d.ts.map +1 -1
- package/dist/project/ProjectMigration.js +47 -5
- package/dist/project/ProjectProfile.d.ts +1 -0
- package/dist/project/ProjectProfile.d.ts.map +1 -1
- package/dist/project/ProjectProfile.js +5 -0
- package/dist/project/audio/AudioContentFactory.d.ts +34 -0
- package/dist/project/audio/AudioContentFactory.d.ts.map +1 -0
- package/dist/project/audio/AudioContentFactory.js +107 -0
- package/dist/project/audio/AudioContentHelpers.d.ts +7 -0
- package/dist/project/audio/AudioContentHelpers.d.ts.map +1 -0
- package/dist/project/audio/AudioContentHelpers.js +17 -0
- package/dist/project/audio/AudioContentModifier.d.ts +10 -0
- package/dist/project/audio/AudioContentModifier.d.ts.map +1 -0
- package/dist/project/audio/AudioContentModifier.js +127 -0
- package/dist/project/audio/AudioFileBoxFactory.d.ts +8 -0
- package/dist/project/audio/AudioFileBoxFactory.d.ts.map +1 -0
- package/dist/project/audio/AudioFileBoxFactory.js +36 -0
- package/dist/project/audio/index.d.ts +4 -0
- package/dist/project/audio/index.d.ts.map +1 -0
- package/dist/project/audio/index.js +3 -0
- package/dist/project/index.d.ts +1 -0
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +1 -0
- package/dist/samples/DefaultSampleLoader.d.ts +2 -1
- package/dist/samples/DefaultSampleLoader.d.ts.map +1 -1
- package/dist/samples/DefaultSampleLoader.js +1 -1
- package/dist/samples/DefaultSampleLoaderManager.d.ts +3 -1
- package/dist/samples/DefaultSampleLoaderManager.d.ts.map +1 -1
- package/dist/samples/DefaultSampleLoaderManager.js +13 -0
- package/dist/samples/OpenSampleAPI.d.ts +2 -1
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +2 -2
- package/dist/samples/SampleAPI.d.ts +2 -1
- package/dist/samples/SampleAPI.d.ts.map +1 -1
- package/dist/samples/SampleProvider.d.ts +2 -1
- package/dist/samples/SampleProvider.d.ts.map +1 -1
- package/dist/samples/SampleService.d.ts.map +1 -1
- package/dist/samples/SampleStorage.d.ts +2 -1
- package/dist/samples/SampleStorage.d.ts.map +1 -1
- package/dist/samples/SampleStorage.js +6 -5
- package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
- package/dist/soundfont/OpenSoundfontAPI.js +3 -3
- package/dist/workers-main.js +1 -5
- package/dist/workers-main.js.map +4 -4
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,IAAI,EAEJ,SAAS,EAET,UAAU,EACV,eAAe,EACf,UAAU,EACV,IAAI,EACP,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACH,WAAW,EAGX,YAAY,EACZ,KAAK,EAEL,OAAO,EACP,WAAW,EAEX,gBAAgB,EACnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAEhB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAElB,kBAAkB,EAClB,eAAe,EAClB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAC,qBAAqB,EAAE,kBAAkB,EAAC,MAAM,qBAAqB,CAAA;AAC7E,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AACvC,OAAO,EAAC,KAAK,EAAC,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAY,MAAM,YAAY,CAAA;AACpD,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAC,aAAa,EAAC,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAc,YAAY,EAAC,MAAM,SAAS,CAAA;AAGjD,OAAO,EAAyB,IAAI,EAAE,QAAQ,EAAW,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
|
package/dist/project/Project.js
CHANGED
|
@@ -12,6 +12,7 @@ import { MidiDevices, MIDILearning } from "../midi";
|
|
|
12
12
|
import { ProjectValidation } from "./ProjectValidation";
|
|
13
13
|
import { Preferences } from "../Preferences";
|
|
14
14
|
import { ConstantTempoMap, PPQN, TimeBase } from "@opendaw/lib-dsp";
|
|
15
|
+
import { MidiData } from "@opendaw/lib-midi";
|
|
15
16
|
// Main Entry Point for a Project
|
|
16
17
|
export class Project {
|
|
17
18
|
static new(env, options) {
|
|
@@ -143,8 +144,19 @@ export class Project {
|
|
|
143
144
|
};
|
|
144
145
|
}
|
|
145
146
|
receivedMIDIFromEngine(midiDeviceId, data, relativeTimeInMs) {
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
const debug = false;
|
|
148
|
+
if (debug) {
|
|
149
|
+
console.debug("receivedMIDIFromEngine", MidiData.debug(data), relativeTimeInMs);
|
|
150
|
+
}
|
|
151
|
+
const timestamp = performance.now() + relativeTimeInMs;
|
|
152
|
+
MidiDevices.findOutputDeviceById(midiDeviceId).ifSome(midiOutputDevice => {
|
|
153
|
+
try {
|
|
154
|
+
midiOutputDevice?.send(data, timestamp);
|
|
155
|
+
}
|
|
156
|
+
catch (reason) {
|
|
157
|
+
console.warn("Failed to send MIDI message", reason);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
148
160
|
}
|
|
149
161
|
collectSampleUUIDs() {
|
|
150
162
|
return this.boxGraph.boxes()
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { float, int, Observer, Option, Subscription } from "@opendaw/lib-std";
|
|
1
|
+
import { Attempt, float, int, Observer, Option, Subscription } from "@opendaw/lib-std";
|
|
2
2
|
import { ppqn } from "@opendaw/lib-dsp";
|
|
3
3
|
import { Field, PointerField } from "@opendaw/lib-box";
|
|
4
4
|
import { Pointers } from "@opendaw/studio-enums";
|
|
5
|
-
import { AudioUnitBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
|
6
|
-
import {
|
|
5
|
+
import { AudioClipBox, AudioRegionBox, AudioUnitBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
|
6
|
+
import { AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
|
|
7
7
|
import { Project } from "./Project";
|
|
8
8
|
import { EffectFactory } from "../EffectFactory";
|
|
9
9
|
import { EffectBox } from "../EffectBox";
|
|
10
|
+
import { AudioContentFactory } from "./audio";
|
|
10
11
|
export type ClipRegionOptions = {
|
|
11
12
|
name?: string;
|
|
12
13
|
hue?: number;
|
|
@@ -42,11 +43,19 @@ export declare class ProjectApi {
|
|
|
42
43
|
catchupAndSubscribeAudioUnits(listener: IndexedAdapterCollectionListener<AudioUnitBoxAdapter>): Subscription;
|
|
43
44
|
createInstrument<A, INST extends InstrumentBox>({ create, defaultIcon, defaultName, trackType }: InstrumentFactory<A, INST>, options?: InstrumentOptions<A>): InstrumentProduct<INST>;
|
|
44
45
|
createAnyInstrument(factory: InstrumentFactory<any, any>): InstrumentProduct<InstrumentBox>;
|
|
46
|
+
replaceMIDIInstrument<A>(target: InstrumentBox, fromFactory: InstrumentFactory<A>, attachment?: A): Attempt<InstrumentBox, string>;
|
|
45
47
|
insertEffect(field: Field<EffectPointerType>, factory: EffectFactory, insertIndex?: int): EffectBox;
|
|
46
48
|
createNoteTrack(audioUnitBox: AudioUnitBox, insertIndex?: int): TrackBox;
|
|
47
49
|
createAudioTrack(audioUnitBox: AudioUnitBox, insertIndex?: int): TrackBox;
|
|
48
50
|
createAutomationTrack(audioUnitBox: AudioUnitBox, target: Field<Pointers.Automation>, insertIndex?: int): TrackBox;
|
|
49
|
-
|
|
51
|
+
createTimeStretchedClip(props: AudioContentFactory.TimeStretchedProps & AudioContentFactory.Clip): AudioClipBox;
|
|
52
|
+
createTimeStretchedRegion(props: AudioContentFactory.TimeStretchedProps & AudioContentFactory.Region): AudioRegionBox;
|
|
53
|
+
createPitchStretchedClip(props: AudioContentFactory.PitchStretchedProps & AudioContentFactory.Clip): AudioClipBox;
|
|
54
|
+
createPitchStretchedRegion(props: AudioContentFactory.PitchStretchedProps & AudioContentFactory.Region): AudioRegionBox;
|
|
55
|
+
createNotStretchedClip(props: AudioContentFactory.NotStretchedProps & AudioContentFactory.Clip): AudioClipBox;
|
|
56
|
+
createNotStretchedRegion(props: AudioContentFactory.NotStretchedProps & AudioContentFactory.Region): AudioRegionBox;
|
|
57
|
+
createNoteClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): NoteClipBox;
|
|
58
|
+
createValueClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): ValueClipBox;
|
|
50
59
|
createNoteRegion({ trackBox, position, duration, loopOffset, loopDuration, eventOffset, eventCollection, mute, name, hue }: NoteRegionParams): NoteRegionBox;
|
|
51
60
|
createTrackRegion(trackBox: TrackBox, position: ppqn, duration: ppqn, { name, hue }?: ClipRegionOptions): Option<NoteRegionBox> | Option<ValueRegionBox>;
|
|
52
61
|
createNoteEvent({ owner, position, duration, velocity, pitch, chance, cent }: NoteEventParams): NoteEventBox;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { assert, clamp, Option, Strings, UUID } from "@opendaw/lib-std";
|
|
1
|
+
import { asInstanceOf, assert, Attempts, clamp, isInstanceOf, Option, panic, Strings, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { PPQN } from "@opendaw/lib-dsp";
|
|
3
3
|
import { IndexedBox } from "@opendaw/lib-box";
|
|
4
4
|
import { AudioUnitType } from "@opendaw/studio-enums";
|
|
5
|
-
import { CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
|
5
|
+
import { AudioUnitBox, CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
|
|
6
6
|
import { AudioUnitFactory, ColorCodes, ProjectQueries, TrackType } from "@opendaw/studio-adapters";
|
|
7
|
+
import { AudioContentFactory } from "./audio";
|
|
7
8
|
// noinspection JSUnusedGlobalSymbols
|
|
8
9
|
export class ProjectApi {
|
|
9
10
|
#project;
|
|
@@ -41,6 +42,26 @@ export class ProjectApi {
|
|
|
41
42
|
createAnyInstrument(factory) {
|
|
42
43
|
return this.createInstrument(factory);
|
|
43
44
|
}
|
|
45
|
+
replaceMIDIInstrument(target, fromFactory, attachment) {
|
|
46
|
+
const replacedInstrumentName = target.label.getValue();
|
|
47
|
+
const hostBox = target.host.targetVertex.unwrap("Is not connect to AudioUnitBox").box;
|
|
48
|
+
const audioUnitBox = asInstanceOf(hostBox, AudioUnitBox);
|
|
49
|
+
if (audioUnitBox.type.getValue() !== AudioUnitType.Instrument) {
|
|
50
|
+
return Attempts.err("AudioUnitBox does not hold an instrument");
|
|
51
|
+
}
|
|
52
|
+
const captureBox = audioUnitBox.capture.targetVertex.unwrap("AudioUnitBox does not hold a capture").box;
|
|
53
|
+
if (!isInstanceOf(captureBox, CaptureMidiBox)) {
|
|
54
|
+
return Attempts.err("Cannot replace instrument without CaptureMidiBox");
|
|
55
|
+
}
|
|
56
|
+
if (fromFactory.trackType !== TrackType.Notes) {
|
|
57
|
+
return Attempts.err("Cannot replace instrument with track type " + TrackType[fromFactory.trackType] + "");
|
|
58
|
+
}
|
|
59
|
+
console.debug(`Replace instrument '${replacedInstrumentName}' with ${fromFactory.defaultName}`);
|
|
60
|
+
target.delete();
|
|
61
|
+
const { boxGraph } = this.#project;
|
|
62
|
+
const { create, defaultIcon, defaultName } = fromFactory;
|
|
63
|
+
return Attempts.ok(create(boxGraph, audioUnitBox.input, defaultName, defaultIcon, attachment));
|
|
64
|
+
}
|
|
44
65
|
insertEffect(field, factory, insertIndex = Number.MAX_SAFE_INTEGER) {
|
|
45
66
|
return factory.create(this.#project, field, IndexedBox.insertOrder(field, insertIndex));
|
|
46
67
|
}
|
|
@@ -53,36 +74,57 @@ export class ProjectApi {
|
|
|
53
74
|
createAutomationTrack(audioUnitBox, target, insertIndex = Number.MAX_SAFE_INTEGER) {
|
|
54
75
|
return this.#createTrack({ field: audioUnitBox.tracks, target, trackType: TrackType.Value, insertIndex });
|
|
55
76
|
}
|
|
56
|
-
|
|
77
|
+
createTimeStretchedClip(props) {
|
|
78
|
+
return AudioContentFactory.createTimeStretchedClip(props);
|
|
79
|
+
}
|
|
80
|
+
createTimeStretchedRegion(props) {
|
|
81
|
+
return AudioContentFactory.createTimeStretchedRegion(props);
|
|
82
|
+
}
|
|
83
|
+
createPitchStretchedClip(props) {
|
|
84
|
+
return AudioContentFactory.createPitchStretchedClip(props);
|
|
85
|
+
}
|
|
86
|
+
createPitchStretchedRegion(props) {
|
|
87
|
+
return AudioContentFactory.createPitchStretchedRegion(props);
|
|
88
|
+
}
|
|
89
|
+
createNotStretchedClip(props) {
|
|
90
|
+
return AudioContentFactory.createNotStretchedClip(props);
|
|
91
|
+
}
|
|
92
|
+
createNotStretchedRegion(props) {
|
|
93
|
+
return AudioContentFactory.createNotStretchedRegion(props);
|
|
94
|
+
}
|
|
95
|
+
createNoteClip(trackBox, clipIndex, { name, hue } = {}) {
|
|
57
96
|
const { boxGraph } = this.#project;
|
|
58
97
|
const type = trackBox.type.getValue();
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const events = NoteEventCollectionBox.create(boxGraph, UUID.generate());
|
|
62
|
-
return Option.wrap(NoteClipBox.create(boxGraph, UUID.generate(), box => {
|
|
63
|
-
box.index.setValue(clipIndex);
|
|
64
|
-
box.label.setValue(name ?? "Notes");
|
|
65
|
-
box.hue.setValue(hue ?? ColorCodes.forTrackType(type));
|
|
66
|
-
box.mute.setValue(false);
|
|
67
|
-
box.duration.setValue(PPQN.Bar);
|
|
68
|
-
box.clips.refer(trackBox.clips);
|
|
69
|
-
box.events.refer(events.owners);
|
|
70
|
-
}));
|
|
71
|
-
}
|
|
72
|
-
case TrackType.Value: {
|
|
73
|
-
const events = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
74
|
-
return Option.wrap(ValueClipBox.create(boxGraph, UUID.generate(), box => {
|
|
75
|
-
box.index.setValue(clipIndex);
|
|
76
|
-
box.label.setValue(name ?? "Automation");
|
|
77
|
-
box.hue.setValue(hue ?? ColorCodes.forTrackType(type));
|
|
78
|
-
box.mute.setValue(false);
|
|
79
|
-
box.duration.setValue(PPQN.Bar);
|
|
80
|
-
box.events.refer(events.owners);
|
|
81
|
-
box.clips.refer(trackBox.clips);
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
98
|
+
if (type !== TrackType.Notes) {
|
|
99
|
+
return panic("Incompatible track type for note-clip creation: " + type.toString());
|
|
84
100
|
}
|
|
85
|
-
|
|
101
|
+
const events = NoteEventCollectionBox.create(boxGraph, UUID.generate());
|
|
102
|
+
return NoteClipBox.create(boxGraph, UUID.generate(), box => {
|
|
103
|
+
box.index.setValue(clipIndex);
|
|
104
|
+
box.label.setValue(name ?? "Notes");
|
|
105
|
+
box.hue.setValue(hue ?? ColorCodes.forTrackType(type));
|
|
106
|
+
box.mute.setValue(false);
|
|
107
|
+
box.duration.setValue(PPQN.Bar);
|
|
108
|
+
box.clips.refer(trackBox.clips);
|
|
109
|
+
box.events.refer(events.owners);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
createValueClip(trackBox, clipIndex, { name, hue } = {}) {
|
|
113
|
+
const { boxGraph } = this.#project;
|
|
114
|
+
const type = trackBox.type.getValue();
|
|
115
|
+
if (type !== TrackType.Value) {
|
|
116
|
+
return panic("Incompatible track type for value-clip creation: " + type.toString());
|
|
117
|
+
}
|
|
118
|
+
const events = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
119
|
+
return ValueClipBox.create(boxGraph, UUID.generate(), box => {
|
|
120
|
+
box.index.setValue(clipIndex);
|
|
121
|
+
box.label.setValue(name ?? "Automation");
|
|
122
|
+
box.hue.setValue(hue ?? ColorCodes.forTrackType(type));
|
|
123
|
+
box.mute.setValue(false);
|
|
124
|
+
box.duration.setValue(PPQN.Bar);
|
|
125
|
+
box.events.refer(events.owners);
|
|
126
|
+
box.clips.refer(trackBox.clips);
|
|
127
|
+
});
|
|
86
128
|
}
|
|
87
129
|
createNoteRegion({ trackBox, position, duration, loopOffset, loopDuration, eventOffset, eventCollection, mute, name, hue }) {
|
|
88
130
|
if (trackBox.type.getValue() !== TrackType.Notes) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Progress, UUID } from "@opendaw/lib-std";
|
|
2
2
|
import { ProjectEnv } from "./ProjectEnv";
|
|
3
3
|
import { ProjectProfile } from "./ProjectProfile";
|
|
4
4
|
export declare namespace ProjectBundle {
|
|
5
|
-
const encode: ({ uuid, project, meta, cover }: ProjectProfile, progress:
|
|
5
|
+
const encode: ({ uuid, project, meta, cover }: ProjectProfile, progress: Progress.Handler) => Promise<ArrayBuffer>;
|
|
6
6
|
const decode: (env: ProjectEnv, arrayBuffer: ArrayBuffer, openProfileUUID?: UUID.Bytes) => Promise<ProjectProfile>;
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=ProjectBundle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectBundle.d.ts","sourceRoot":"","sources":["../../src/project/ProjectBundle.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ProjectBundle.d.ts","sourceRoot":"","sources":["../../src/project/ProjectBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,QAAQ,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAI1F,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAA;AAO/C,yBAAiB,aAAa,CAAC;IACpB,MAAM,MAAM,GAAU,gCAA8B,cAAc,EAC5C,UAAU,QAAQ,CAAC,OAAO,KAAG,OAAO,CAAC,WAAW,CAoC5E,CAAA;IAEM,MAAM,MAAM,GAAU,KAAK,UAAU,EACf,aAAa,WAAW,EACxB,kBAAkB,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,cAAc,CAqCjF,CAAA;CAgDJ"}
|
|
@@ -27,21 +27,21 @@ export var ProjectBundle;
|
|
|
27
27
|
const loader = project.sampleManager.getOrCreate(uuid);
|
|
28
28
|
const folder = asDefined(samples.folder(UUID.toString(uuid)), "Could not create folder for sample");
|
|
29
29
|
return pipeSampleLoaderInto(loader, folder)
|
|
30
|
-
.then(() => progress
|
|
30
|
+
.then(() => progress(index / audioFileBoxes.length * 0.75));
|
|
31
31
|
}),
|
|
32
32
|
...soundfontFileBoxes
|
|
33
33
|
.map(async ({ address: { uuid } }, index) => {
|
|
34
34
|
const loader = project.soundfontManager.getOrCreate(uuid);
|
|
35
35
|
const folder = asDefined(soundfonts.folder(UUID.toString(uuid)), "Could not create folder for soundfont");
|
|
36
36
|
return pipeSoundfontLoaderInto(loader, folder)
|
|
37
|
-
.then(() => progress
|
|
37
|
+
.then(() => progress(index / soundfontFileBoxes.length * 0.75));
|
|
38
38
|
})
|
|
39
39
|
]).then(() => zip.generateAsync({
|
|
40
40
|
type: "blob",
|
|
41
41
|
compression: "DEFLATE",
|
|
42
42
|
compressionOptions: { level: 6 }
|
|
43
43
|
}));
|
|
44
|
-
progress
|
|
44
|
+
progress(1.0);
|
|
45
45
|
return blob.arrayBuffer();
|
|
46
46
|
};
|
|
47
47
|
ProjectBundle.decode = async (env, arrayBuffer, openProfileUUID) => {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { JSONValue } from "@opendaw/lib-std";
|
|
2
2
|
export type ProjectMeta = {
|
|
3
3
|
name: string;
|
|
4
|
+
artist: string;
|
|
4
5
|
description: string;
|
|
5
6
|
tags: Array<string>;
|
|
6
7
|
created: Readonly<string>;
|
|
7
8
|
modified: string;
|
|
8
9
|
notepad?: string;
|
|
10
|
+
radioToken?: string;
|
|
9
11
|
} & JSONValue;
|
|
10
12
|
export declare namespace ProjectMeta {
|
|
11
13
|
const init: (name?: string) => ProjectMeta;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectMeta.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMeta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAE1C,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"ProjectMeta.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMeta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAA;AAE1C,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,SAAS,CAAA;AAEb,yBAAiB,WAAW,CAAC;IAElB,MAAM,IAAI,GAAI,OAAM,MAAmB,KAAG,WAO/C,CAAA;IAEK,MAAM,IAAI,GAAI,MAAM,WAAW,KAAG,WAAsC,CAAA;CAClF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAYxD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,cAAc,EAAC,EAAE,eAAe,GAAG,IAAI;CA+MpE"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { AudioFileBox, CaptureAudioBox, CaptureMidiBox, GrooveShuffleBox, MIDIOutputBox, ValueEventCurveBox } from "@opendaw/studio-boxes";
|
|
1
|
+
import { AudioFileBox, AudioPitchBox, CaptureAudioBox, CaptureMidiBox, GrooveShuffleBox, MIDIOutputBox, ValueEventCollectionBox, ValueEventCurveBox } from "@opendaw/studio-boxes";
|
|
2
2
|
import { asDefined, asInstanceOf, clamp, Float, UUID } from "@opendaw/lib-std";
|
|
3
3
|
import { AudioPlayback, AudioUnitType } from "@opendaw/studio-enums";
|
|
4
4
|
import { PPQN, TimeBase } from "@opendaw/lib-dsp";
|
|
5
|
+
import { AudioContentHelpers } from "./audio/AudioContentHelpers";
|
|
5
6
|
const isIntEncodedAsFloat = (v) => v > 0 && v < 1e-6 && Number.isFinite(v) && (v / 1.401298464324817e-45) % 1 === 0;
|
|
6
7
|
const toSeconds = (property, bpm) => {
|
|
7
8
|
return PPQN.pulsesToSeconds(property.getValue(), bpm);
|
|
@@ -21,8 +22,8 @@ export class ProjectMigration {
|
|
|
21
22
|
globalShuffle.setValue("Groove Shuffle");
|
|
22
23
|
boxGraph.endTransaction();
|
|
23
24
|
}
|
|
24
|
-
//
|
|
25
|
-
boxGraph.boxes().
|
|
25
|
+
// 1st pass (2nd pass might rely on those changes)
|
|
26
|
+
boxGraph.boxes().forEach(box => box.accept({
|
|
26
27
|
visitAudioFileBox: (box) => {
|
|
27
28
|
const { startInSeconds, endInSeconds } = box;
|
|
28
29
|
if (isIntEncodedAsFloat(startInSeconds.getValue()) || isIntEncodedAsFloat(endInSeconds.getValue())) {
|
|
@@ -32,7 +33,10 @@ export class ProjectMigration {
|
|
|
32
33
|
endInSeconds.setValue(Float.floatToIntBits(endInSeconds.getValue()));
|
|
33
34
|
boxGraph.endTransaction();
|
|
34
35
|
}
|
|
35
|
-
}
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
// 2nd pass. We need to run on a copy, because we might add more boxes during the migration
|
|
39
|
+
boxGraph.boxes().slice().forEach(box => box.accept({
|
|
36
40
|
visitAudioRegionBox: (box) => {
|
|
37
41
|
const { duration, loopOffset, loopDuration, playback } = box;
|
|
38
42
|
if (isIntEncodedAsFloat(duration.getValue())
|
|
@@ -54,11 +58,49 @@ export class ProjectMigration {
|
|
|
54
58
|
const scale = fileDuration / currentLoopDurationSeconds;
|
|
55
59
|
const currentDurationSeconds = toSeconds(box.duration, bpm.getValue());
|
|
56
60
|
const currentLoopOffsetSeconds = toSeconds(box.loopOffset, bpm.getValue());
|
|
57
|
-
box.playback.setValue(AudioPlayback.NoSync);
|
|
58
61
|
box.timeBase.setValue(TimeBase.Seconds);
|
|
59
62
|
box.duration.setValue(currentDurationSeconds * scale);
|
|
60
63
|
box.loopDuration.setValue(fileDuration);
|
|
61
64
|
box.loopOffset.setValue(currentLoopOffsetSeconds * scale);
|
|
65
|
+
box.playback.setValue("");
|
|
66
|
+
boxGraph.endTransaction();
|
|
67
|
+
}
|
|
68
|
+
else if (playback.getValue() === AudioPlayback.Pitch) {
|
|
69
|
+
console.debug("Migrate 'AudioRegionBox' to new PitchStretchBox");
|
|
70
|
+
boxGraph.beginTransaction();
|
|
71
|
+
const file = asInstanceOf(box.file.targetVertex.unwrap(), AudioFileBox);
|
|
72
|
+
const fileDuration = file.endInSeconds.getValue() - file.startInSeconds.getValue();
|
|
73
|
+
const pitchBox = AudioPitchBox.create(boxGraph, UUID.generate());
|
|
74
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, pitchBox, box.duration.getValue(), fileDuration);
|
|
75
|
+
box.timeBase.setValue(TimeBase.Musical);
|
|
76
|
+
box.playMode.refer(pitchBox);
|
|
77
|
+
box.playback.setValue("");
|
|
78
|
+
boxGraph.endTransaction();
|
|
79
|
+
}
|
|
80
|
+
if (box.events.isEmpty()) {
|
|
81
|
+
console.debug("Migrate 'AudioRegionBox' to have a ValueEventCollectionBox");
|
|
82
|
+
boxGraph.beginTransaction();
|
|
83
|
+
box.events.refer(ValueEventCollectionBox.create(boxGraph, UUID.generate()).owners);
|
|
84
|
+
boxGraph.endTransaction();
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
visitAudioClipBox: (box) => {
|
|
88
|
+
if (box.events.isEmpty()) {
|
|
89
|
+
console.debug("Migrate 'AudioClipBox' to have a ValueEventCollectionBox");
|
|
90
|
+
boxGraph.beginTransaction();
|
|
91
|
+
box.events.refer(ValueEventCollectionBox.create(boxGraph, UUID.generate()).owners);
|
|
92
|
+
boxGraph.endTransaction();
|
|
93
|
+
}
|
|
94
|
+
if (box.playback.getValue() === AudioPlayback.Pitch) {
|
|
95
|
+
console.debug("Migrate 'AudioClipBox' to new PitchStretchBox");
|
|
96
|
+
boxGraph.beginTransaction();
|
|
97
|
+
const file = asInstanceOf(box.file.targetVertex.unwrap(), AudioFileBox);
|
|
98
|
+
const fileDuration = file.endInSeconds.getValue() - file.startInSeconds.getValue();
|
|
99
|
+
const pitchBox = AudioPitchBox.create(boxGraph, UUID.generate());
|
|
100
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, pitchBox, box.duration.getValue(), fileDuration);
|
|
101
|
+
box.timeBase.setValue(TimeBase.Musical);
|
|
102
|
+
box.playMode.refer(pitchBox);
|
|
103
|
+
box.playback.setValue("");
|
|
62
104
|
boxGraph.endTransaction();
|
|
63
105
|
}
|
|
64
106
|
},
|
|
@@ -16,6 +16,7 @@ export declare class ProjectProfile {
|
|
|
16
16
|
updateCover(cover: Option<ArrayBuffer>): void;
|
|
17
17
|
updateMetaData<KEY extends keyof ProjectMeta>(key: KEY, value: ProjectMeta[KEY]): void;
|
|
18
18
|
updateModifyDate(): void;
|
|
19
|
+
copyForUpload(): ProjectProfile;
|
|
19
20
|
toString(): string;
|
|
20
21
|
}
|
|
21
22
|
//# sourceMappingURL=ProjectProfile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectProfile.d.ts","sourceRoot":"","sources":["../../src/project/ProjectProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AACzC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,qBAAa,cAAc;;gBAYX,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,YAAY,GAAE,OAAe;IAUzC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAoB;IAC1C,IAAI,OAAO,IAAI,OAAO,CAAuB;IAC7C,IAAI,IAAI,IAAI,WAAW,CAAoB;IAC3C,IAAI,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,CAAqB;IAE/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAqBhE,KAAK,IAAI,OAAO;IAChB,UAAU,IAAI,OAAO;IAErB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,YAAY;IAIhE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI;IAK7C,cAAc,CAAC,GAAG,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;IAOtF,gBAAgB,IAAI,IAAI;IAExB,QAAQ,IAAI,MAAM;CAcrB"}
|
|
1
|
+
{"version":3,"file":"ProjectProfile.d.ts","sourceRoot":"","sources":["../../src/project/ProjectProfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AACzC,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAA;AAIjC,qBAAa,cAAc;;gBAYX,IAAI,EAAE,IAAI,CAAC,KAAK,EAChB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAC1B,YAAY,GAAE,OAAe;IAUzC,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAoB;IAC1C,IAAI,OAAO,IAAI,OAAO,CAAuB;IAC7C,IAAI,IAAI,IAAI,WAAW,CAAoB;IAC3C,IAAI,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,CAAqB;IAE/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAqBhE,KAAK,IAAI,OAAO;IAChB,UAAU,IAAI,OAAO;IAErB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,YAAY;IAIhE,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI;IAK7C,cAAc,CAAC,GAAG,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI;IAOtF,gBAAgB,IAAI,IAAI;IAExB,aAAa,IAAI,cAAc;IAM/B,QAAQ,IAAI,MAAM;CAcrB"}
|
|
@@ -67,6 +67,11 @@ export class ProjectProfile {
|
|
|
67
67
|
this.#metaUpdated.notify(this.meta);
|
|
68
68
|
}
|
|
69
69
|
updateModifyDate() { this.meta.modified = new Date().toISOString(); }
|
|
70
|
+
copyForUpload() {
|
|
71
|
+
const meta = ProjectMeta.copy(this.meta);
|
|
72
|
+
delete meta.radioToken; // we do not expose this
|
|
73
|
+
return new ProjectProfile(this.uuid, this.project, meta, this.cover);
|
|
74
|
+
}
|
|
70
75
|
toString() {
|
|
71
76
|
return `{uuid: ${UUID.toString(this.uuid)}, meta: ${JSON.stringify(this.meta)}}`;
|
|
72
77
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ppqn } from "@opendaw/lib-dsp";
|
|
2
|
+
import { Sample } from "@opendaw/studio-adapters";
|
|
3
|
+
import { int } from "@opendaw/lib-std";
|
|
4
|
+
import { AudioClipBox, AudioFileBox, AudioRegionBox, TrackBox } from "@opendaw/studio-boxes";
|
|
5
|
+
import { TransientPlayMode } from "@opendaw/studio-enums";
|
|
6
|
+
import { BoxGraph } from "@opendaw/lib-box";
|
|
7
|
+
export declare namespace AudioContentFactory {
|
|
8
|
+
type Props = {
|
|
9
|
+
boxGraph: BoxGraph;
|
|
10
|
+
targetTrack: TrackBox;
|
|
11
|
+
audioFileBox: AudioFileBox;
|
|
12
|
+
sample: Sample;
|
|
13
|
+
gainInDb?: number;
|
|
14
|
+
};
|
|
15
|
+
type Clip = Props & {
|
|
16
|
+
index: int;
|
|
17
|
+
};
|
|
18
|
+
type Region = Props & {
|
|
19
|
+
position: ppqn;
|
|
20
|
+
};
|
|
21
|
+
type TimeStretchedProps = {
|
|
22
|
+
transientPlayMode?: TransientPlayMode;
|
|
23
|
+
playbackRate?: number;
|
|
24
|
+
} & Props;
|
|
25
|
+
type PitchStretchedProps = {} & Props;
|
|
26
|
+
type NotStretchedProps = {} & Props;
|
|
27
|
+
const createTimeStretchedRegion: (props: TimeStretchedProps & Region) => AudioRegionBox;
|
|
28
|
+
const createPitchStretchedRegion: (props: PitchStretchedProps & Region) => AudioRegionBox;
|
|
29
|
+
const createNotStretchedRegion: (props: NotStretchedProps & Region) => AudioRegionBox;
|
|
30
|
+
const createTimeStretchedClip: (props: TimeStretchedProps & Clip) => AudioClipBox;
|
|
31
|
+
const createPitchStretchedClip: (props: PitchStretchedProps & Clip) => AudioClipBox;
|
|
32
|
+
const createNotStretchedClip: (props: NotStretchedProps & Clip) => AudioClipBox;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=AudioContentFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioContentFactory.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAiB,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAa,MAAM,EAAY,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAC,GAAG,EAA6B,MAAM,kBAAkB,CAAA;AAChE,OAAO,EACH,YAAY,EACZ,YAAY,EAEZ,cAAc,EAEd,QAAQ,EAEX,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAC,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AAGzC,yBAAiB,mBAAmB,CAAC;IACjC,KAAY,KAAK,GAAG;QAChB,QAAQ,EAAE,QAAQ,CAAC;QACnB,WAAW,EAAE,QAAQ,CAAC;QACtB,YAAY,EAAE,YAAY,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IAED,KAAY,IAAI,GAAG,KAAK,GAAG;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,CAAA;IACzC,KAAY,MAAM,GAAG,KAAK,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,CAAA;IAE/C,KAAY,kBAAkB,GAAG;QAC7B,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;QACrC,YAAY,CAAC,EAAE,MAAM,CAAA;KACxB,GAAG,KAAK,CAAA;IAET,KAAY,mBAAmB,GAAG,EAA0C,GAAG,KAAK,CAAA;IAEpF,KAAY,iBAAiB,GAAG,EAA0C,GAAG,KAAK,CAAA;IAI3E,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,GAAG,MAAM,KAAG,cAM9E,CAAA;IAEM,MAAM,0BAA0B,GAAI,OAAO,mBAAmB,GAAG,MAAM,KAAG,cAEhF,CAAA;IAEM,MAAM,wBAAwB,GAAI,OAAO,iBAAiB,GAAG,MAAM,KAAG,cAe5E,CAAA;IAIM,MAAM,uBAAuB,GAAI,OAAO,kBAAkB,GAAG,IAAI,KAAG,YAM1E,CAAA;IAEM,MAAM,wBAAwB,GAAI,OAAO,mBAAmB,GAAG,IAAI,KAAG,YAG5E,CAAA;IAEM,MAAM,sBAAsB,GAAI,OAAO,iBAAiB,GAAG,IAAI,KAAG,YAaxE,CAAA;CAmDJ"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { PPQN, TimeBase } from "@opendaw/lib-dsp";
|
|
2
|
+
import { ColorCodes, TrackType } from "@opendaw/studio-adapters";
|
|
3
|
+
import { panic, quantizeRound, UUID } from "@opendaw/lib-std";
|
|
4
|
+
import { AudioClipBox, AudioPitchBox, AudioRegionBox, AudioTimeStretchBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
|
|
5
|
+
import { TransientPlayMode } from "@opendaw/studio-enums";
|
|
6
|
+
import { AudioContentHelpers } from "./AudioContentHelpers";
|
|
7
|
+
export var AudioContentFactory;
|
|
8
|
+
(function (AudioContentFactory) {
|
|
9
|
+
// --- Region Creation --- //
|
|
10
|
+
AudioContentFactory.createTimeStretchedRegion = (props) => {
|
|
11
|
+
const { boxGraph, playbackRate, transientPlayMode } = props;
|
|
12
|
+
return createRegionWithWarpMarkers(AudioTimeStretchBox.create(boxGraph, UUID.generate(), box => {
|
|
13
|
+
box.transientPlayMode.setValue(transientPlayMode ?? TransientPlayMode.Pingpong);
|
|
14
|
+
box.playbackRate.setValue(playbackRate ?? 1.0);
|
|
15
|
+
}), props);
|
|
16
|
+
};
|
|
17
|
+
AudioContentFactory.createPitchStretchedRegion = (props) => {
|
|
18
|
+
return createRegionWithWarpMarkers(AudioPitchBox.create(props.boxGraph, UUID.generate()), props);
|
|
19
|
+
};
|
|
20
|
+
AudioContentFactory.createNotStretchedRegion = (props) => {
|
|
21
|
+
const { boxGraph, targetTrack, position, audioFileBox, sample: { name, duration: durationInSeconds } } = props;
|
|
22
|
+
const collectionBox = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
23
|
+
return AudioRegionBox.create(boxGraph, UUID.generate(), box => {
|
|
24
|
+
box.position.setValue(position);
|
|
25
|
+
box.duration.setValue(durationInSeconds);
|
|
26
|
+
box.loopDuration.setValue(durationInSeconds);
|
|
27
|
+
box.regions.refer(targetTrack.regions);
|
|
28
|
+
box.hue.setValue(ColorCodes.forTrackType(targetTrack.type.getValue()));
|
|
29
|
+
box.label.setValue(name);
|
|
30
|
+
box.file.refer(audioFileBox);
|
|
31
|
+
box.events.refer(collectionBox.owners);
|
|
32
|
+
box.timeBase.setValue(TimeBase.Seconds);
|
|
33
|
+
box.gain.setValue(props.gainInDb ?? 0.0);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
// --- Clip Creation --- //
|
|
37
|
+
AudioContentFactory.createTimeStretchedClip = (props) => {
|
|
38
|
+
const { boxGraph, playbackRate, transientPlayMode } = props;
|
|
39
|
+
return createClipWithWarpMarkers(AudioTimeStretchBox.create(boxGraph, UUID.generate(), box => {
|
|
40
|
+
box.transientPlayMode.setValue(transientPlayMode ?? TransientPlayMode.Pingpong);
|
|
41
|
+
box.playbackRate.setValue(playbackRate ?? 1.0);
|
|
42
|
+
}), props);
|
|
43
|
+
};
|
|
44
|
+
AudioContentFactory.createPitchStretchedClip = (props) => {
|
|
45
|
+
const { boxGraph } = props;
|
|
46
|
+
return createClipWithWarpMarkers(AudioTimeStretchBox.create(boxGraph, UUID.generate()), props);
|
|
47
|
+
};
|
|
48
|
+
AudioContentFactory.createNotStretchedClip = (props) => {
|
|
49
|
+
const { boxGraph, targetTrack, index, audioFileBox, sample: { name, duration: durationInSeconds } } = props;
|
|
50
|
+
const collectionBox = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
51
|
+
return AudioClipBox.create(boxGraph, UUID.generate(), box => {
|
|
52
|
+
box.duration.setValue(durationInSeconds);
|
|
53
|
+
box.clips.refer(targetTrack.clips);
|
|
54
|
+
box.hue.setValue(ColorCodes.forTrackType(targetTrack.type.getValue()));
|
|
55
|
+
box.label.setValue(name);
|
|
56
|
+
box.file.refer(audioFileBox);
|
|
57
|
+
box.events.refer(collectionBox.owners);
|
|
58
|
+
box.timeBase.setValue(TimeBase.Seconds);
|
|
59
|
+
box.index.setValue(index);
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
// ---- HELPERS ---- //
|
|
63
|
+
const createRegionWithWarpMarkers = (playMode, props) => {
|
|
64
|
+
const { boxGraph, targetTrack, position, audioFileBox, sample } = props;
|
|
65
|
+
if (targetTrack.type.getValue() !== TrackType.Audio) {
|
|
66
|
+
return panic("Cannot create audio-region on non-audio track");
|
|
67
|
+
}
|
|
68
|
+
const { name, duration: durationInSeconds, bpm } = sample;
|
|
69
|
+
const durationInPPQN = quantizeRound(PPQN.secondsToPulses(durationInSeconds, bpm), PPQN.SemiQuaver);
|
|
70
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, playMode, durationInPPQN, durationInSeconds);
|
|
71
|
+
const collectionBox = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
72
|
+
return AudioRegionBox.create(boxGraph, UUID.generate(), box => {
|
|
73
|
+
box.position.setValue(position);
|
|
74
|
+
box.duration.setValue(durationInPPQN);
|
|
75
|
+
box.loopDuration.setValue(durationInPPQN);
|
|
76
|
+
box.regions.refer(targetTrack.regions);
|
|
77
|
+
box.hue.setValue(ColorCodes.forTrackType(targetTrack.type.getValue()));
|
|
78
|
+
box.label.setValue(name);
|
|
79
|
+
box.file.refer(audioFileBox);
|
|
80
|
+
box.events.refer(collectionBox.owners);
|
|
81
|
+
box.timeBase.setValue(TimeBase.Musical);
|
|
82
|
+
box.playMode.refer(playMode);
|
|
83
|
+
box.gain.setValue(props.gainInDb ?? 0.0);
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
const createClipWithWarpMarkers = (playMode, props) => {
|
|
87
|
+
const { boxGraph, targetTrack, audioFileBox, sample } = props;
|
|
88
|
+
if (targetTrack.type.getValue() !== TrackType.Audio) {
|
|
89
|
+
return panic("Cannot create audio-region on non-audio track");
|
|
90
|
+
}
|
|
91
|
+
const { name, duration: durationInSeconds, bpm } = sample;
|
|
92
|
+
const durationInPPQN = quantizeRound(PPQN.secondsToPulses(durationInSeconds, bpm), PPQN.SemiQuaver);
|
|
93
|
+
AudioContentHelpers.addDefaultWarpMarkers(boxGraph, playMode, durationInPPQN, durationInSeconds);
|
|
94
|
+
const collectionBox = ValueEventCollectionBox.create(boxGraph, UUID.generate());
|
|
95
|
+
return AudioClipBox.create(boxGraph, UUID.generate(), box => {
|
|
96
|
+
box.duration.setValue(durationInPPQN);
|
|
97
|
+
box.clips.refer(targetTrack.clips);
|
|
98
|
+
box.hue.setValue(ColorCodes.forTrackType(targetTrack.type.getValue()));
|
|
99
|
+
box.label.setValue(name);
|
|
100
|
+
box.file.refer(audioFileBox);
|
|
101
|
+
box.events.refer(collectionBox.owners);
|
|
102
|
+
box.timeBase.setValue(TimeBase.Musical);
|
|
103
|
+
box.playMode.refer(playMode);
|
|
104
|
+
box.index.setValue(props.index);
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
})(AudioContentFactory || (AudioContentFactory = {}));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BoxGraph } from "@opendaw/lib-box";
|
|
2
|
+
import { AudioPitchBox, AudioTimeStretchBox } from "@opendaw/studio-boxes";
|
|
3
|
+
import { ppqn } from "@opendaw/lib-dsp";
|
|
4
|
+
export declare namespace AudioContentHelpers {
|
|
5
|
+
const addDefaultWarpMarkers: (boxGraph: BoxGraph, playMode: AudioPitchBox | AudioTimeStretchBox, durationInPPQN: ppqn, durationInSeconds: number) => void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=AudioContentHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioContentHelpers.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAC,aAAa,EAAE,mBAAmB,EAAgB,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAAC,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAGrC,yBAAiB,mBAAmB,CAAC;IAC1B,MAAM,qBAAqB,GAAI,UAAU,QAAQ,EAClB,UAAU,aAAa,GAAG,mBAAmB,EAC7C,gBAAgB,IAAI,EACpB,mBAAmB,MAAM,SAW9D,CAAA;CACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WarpMarkerBox } from "@opendaw/studio-boxes";
|
|
2
|
+
import { UUID } from "@opendaw/lib-std";
|
|
3
|
+
export var AudioContentHelpers;
|
|
4
|
+
(function (AudioContentHelpers) {
|
|
5
|
+
AudioContentHelpers.addDefaultWarpMarkers = (boxGraph, playMode, durationInPPQN, durationInSeconds) => {
|
|
6
|
+
WarpMarkerBox.create(boxGraph, UUID.generate(), box => {
|
|
7
|
+
box.owner.refer(playMode.warpMarkers);
|
|
8
|
+
box.position.setValue(0);
|
|
9
|
+
box.seconds.setValue(0);
|
|
10
|
+
});
|
|
11
|
+
WarpMarkerBox.create(boxGraph, UUID.generate(), box => {
|
|
12
|
+
box.owner.refer(playMode.warpMarkers);
|
|
13
|
+
box.position.setValue(durationInPPQN);
|
|
14
|
+
box.seconds.setValue(durationInSeconds);
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
})(AudioContentHelpers || (AudioContentHelpers = {}));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AudioClipBoxAdapter, AudioRegionBoxAdapter } from "@opendaw/studio-adapters";
|
|
2
|
+
import { Exec } from "@opendaw/lib-std";
|
|
3
|
+
export declare namespace AudioContentModifier {
|
|
4
|
+
type AudioContentOwner = AudioRegionBoxAdapter | AudioClipBoxAdapter;
|
|
5
|
+
export const toNotStretched: (adapters: ReadonlyArray<AudioContentOwner>) => Promise<Exec>;
|
|
6
|
+
export const toPitchStretch: (adapters: ReadonlyArray<AudioContentOwner>) => Promise<Exec>;
|
|
7
|
+
export const toTimeStretch: (adapters: ReadonlyArray<AudioContentOwner>) => Promise<Exec>;
|
|
8
|
+
export {};
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=AudioContentModifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AudioContentModifier.d.ts","sourceRoot":"","sources":["../../../src/project/audio/AudioContentModifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,0BAA0B,CAAA;AACnF,OAAO,EAAY,IAAI,EAAgC,MAAM,kBAAkB,CAAA;AAY/E,yBAAiB,oBAAoB,CAAC;IAClC,KAAK,iBAAiB,GAAG,qBAAqB,GAAG,mBAAmB,CAAA;IAEpE,MAAM,CAAC,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,iBAAiB,CAAC,KAAG,OAAO,CAAC,IAAI,CAO7F,CAAA;IAED,MAAM,CAAC,MAAM,cAAc,GAAU,UAAU,aAAa,CAAC,iBAAiB,CAAC,KAAG,OAAO,CAAC,IAAI,CA2B7F,CAAA;IAED,MAAM,CAAC,MAAM,aAAa,GAAU,UAAU,aAAa,CAAC,iBAAiB,CAAC,KAAG,OAAO,CAAC,IAAI,CA2C5F,CAAA;;CA2BJ"}
|