@opendaw/studio-core 0.0.58 → 0.0.60

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.
Files changed (112) hide show
  1. package/dist/AudioOfflineRenderer.d.ts +2 -2
  2. package/dist/AudioOfflineRenderer.d.ts.map +1 -1
  3. package/dist/AudioOfflineRenderer.js +9 -9
  4. package/dist/AudioUtils.d.ts +4 -0
  5. package/dist/AudioUtils.d.ts.map +1 -0
  6. package/dist/AudioUtils.js +20 -0
  7. package/dist/EffectBox.d.ts +2 -2
  8. package/dist/EffectBox.d.ts.map +1 -1
  9. package/dist/EffectFactories.d.ts +3 -0
  10. package/dist/EffectFactories.d.ts.map +1 -1
  11. package/dist/EffectFactories.js +17 -3
  12. package/dist/Engine.d.ts +1 -1
  13. package/dist/Engine.d.ts.map +1 -1
  14. package/dist/EngineFacade.d.ts +1 -1
  15. package/dist/EngineFacade.d.ts.map +1 -1
  16. package/dist/EngineFacade.js +1 -1
  17. package/dist/EngineWorklet.d.ts.map +1 -1
  18. package/dist/EngineWorklet.js +7 -8
  19. package/dist/ExternalLib.d.ts +0 -1
  20. package/dist/ExternalLib.d.ts.map +1 -1
  21. package/dist/ExternalLib.js +0 -1
  22. package/dist/FilePickerAcceptTypes.d.ts.map +1 -1
  23. package/dist/Preferences.d.ts +4 -0
  24. package/dist/Preferences.d.ts.map +1 -1
  25. package/dist/Preferences.js +2 -0
  26. package/dist/RecordingWorklet.d.ts +2 -1
  27. package/dist/RecordingWorklet.d.ts.map +1 -1
  28. package/dist/WavFile.d.ts +4 -7
  29. package/dist/WavFile.d.ts.map +1 -1
  30. package/dist/WavFile.js +22 -21
  31. package/dist/Workers.d.ts +2 -0
  32. package/dist/Workers.d.ts.map +1 -1
  33. package/dist/Workers.js +11 -0
  34. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  35. package/dist/capture/CaptureAudio.js +0 -2
  36. package/dist/capture/RecordAudio.d.ts.map +1 -1
  37. package/dist/capture/RecordAudio.js +3 -1
  38. package/dist/cloud/CloudBackupProjects.js +4 -4
  39. package/dist/cloud/CloudBackupSamples.d.ts.map +1 -1
  40. package/dist/cloud/CloudBackupSamples.js +3 -9
  41. package/dist/cloud/CloudBackupSoundfonts.js +1 -1
  42. package/dist/dawproject/DawProjectExporter.d.ts.map +1 -1
  43. package/dist/dawproject/DawProjectExporter.js +2 -12
  44. package/dist/dawproject/DawProjectImporter.d.ts.map +1 -1
  45. package/dist/dawproject/DawProjectImporter.js +5 -3
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -0
  49. package/dist/midi/MIDIReceiver.d.ts +12 -0
  50. package/dist/midi/MIDIReceiver.d.ts.map +1 -0
  51. package/dist/midi/MIDIReceiver.js +65 -0
  52. package/dist/midi/MidiDevices.d.ts +4 -1
  53. package/dist/midi/MidiDevices.d.ts.map +1 -1
  54. package/dist/midi/MidiDevices.js +40 -1
  55. package/dist/processors.js +17 -19
  56. package/dist/processors.js.map +4 -4
  57. package/dist/project/Project.d.ts.map +1 -1
  58. package/dist/project/Project.js +14 -2
  59. package/dist/project/ProjectApi.d.ts +13 -4
  60. package/dist/project/ProjectApi.d.ts.map +1 -1
  61. package/dist/project/ProjectApi.js +71 -29
  62. package/dist/project/ProjectBundle.d.ts +2 -2
  63. package/dist/project/ProjectBundle.d.ts.map +1 -1
  64. package/dist/project/ProjectBundle.js +3 -3
  65. package/dist/project/ProjectMeta.d.ts +2 -0
  66. package/dist/project/ProjectMeta.d.ts.map +1 -1
  67. package/dist/project/ProjectMeta.js +1 -0
  68. package/dist/project/ProjectMigration.d.ts.map +1 -1
  69. package/dist/project/ProjectMigration.js +47 -5
  70. package/dist/project/ProjectProfile.d.ts +1 -0
  71. package/dist/project/ProjectProfile.d.ts.map +1 -1
  72. package/dist/project/ProjectProfile.js +5 -0
  73. package/dist/project/audio/AudioContentFactory.d.ts +34 -0
  74. package/dist/project/audio/AudioContentFactory.d.ts.map +1 -0
  75. package/dist/project/audio/AudioContentFactory.js +107 -0
  76. package/dist/project/audio/AudioContentHelpers.d.ts +7 -0
  77. package/dist/project/audio/AudioContentHelpers.d.ts.map +1 -0
  78. package/dist/project/audio/AudioContentHelpers.js +17 -0
  79. package/dist/project/audio/AudioContentModifier.d.ts +10 -0
  80. package/dist/project/audio/AudioContentModifier.d.ts.map +1 -0
  81. package/dist/project/audio/AudioContentModifier.js +129 -0
  82. package/dist/project/audio/AudioFileBoxFactory.d.ts +8 -0
  83. package/dist/project/audio/AudioFileBoxFactory.d.ts.map +1 -0
  84. package/dist/project/audio/AudioFileBoxFactory.js +36 -0
  85. package/dist/project/audio/index.d.ts +4 -0
  86. package/dist/project/audio/index.d.ts.map +1 -0
  87. package/dist/project/audio/index.js +3 -0
  88. package/dist/project/index.d.ts +1 -0
  89. package/dist/project/index.d.ts.map +1 -1
  90. package/dist/project/index.js +1 -0
  91. package/dist/samples/DefaultSampleLoader.d.ts +2 -1
  92. package/dist/samples/DefaultSampleLoader.d.ts.map +1 -1
  93. package/dist/samples/DefaultSampleLoader.js +1 -1
  94. package/dist/samples/DefaultSampleLoaderManager.d.ts +3 -1
  95. package/dist/samples/DefaultSampleLoaderManager.d.ts.map +1 -1
  96. package/dist/samples/DefaultSampleLoaderManager.js +13 -0
  97. package/dist/samples/OpenSampleAPI.d.ts +2 -1
  98. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  99. package/dist/samples/OpenSampleAPI.js +2 -2
  100. package/dist/samples/SampleAPI.d.ts +2 -1
  101. package/dist/samples/SampleAPI.d.ts.map +1 -1
  102. package/dist/samples/SampleProvider.d.ts +2 -1
  103. package/dist/samples/SampleProvider.d.ts.map +1 -1
  104. package/dist/samples/SampleService.d.ts.map +1 -1
  105. package/dist/samples/SampleStorage.d.ts +2 -1
  106. package/dist/samples/SampleStorage.d.ts.map +1 -1
  107. package/dist/samples/SampleStorage.js +6 -5
  108. package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
  109. package/dist/soundfont/OpenSoundfontAPI.js +3 -3
  110. package/dist/workers-main.js +1 -5
  111. package/dist/workers-main.js.map +4 -4
  112. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
@@ -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
- MidiDevices.get().ifSome(midiAccess => midiAccess.outputs
147
- .get(midiDeviceId)?.send(data, performance.now() + relativeTimeInMs));
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 { AnyClipBox, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
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
- createClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): Option<AnyClipBox>;
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":"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"}
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
- createClip(trackBox, clipIndex, { name, hue } = {}) {
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
- switch (type) {
60
- case TrackType.Notes: {
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
- return Option.None;
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 { MutableObservableValue, unitValue, UUID } from "@opendaw/lib-std";
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: MutableObservableValue<unitValue>) => Promise<ArrayBuffer>;
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,EAA6B,sBAAsB,EAAiB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAInH,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,sBAAsB,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,WAAW,CAoC7F,CAAA;IAEM,MAAM,MAAM,GAAU,KAAK,UAAU,EACf,aAAa,WAAW,EACxB,kBAAkB,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,cAAc,CAqCjF,CAAA;CAgDJ"}
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.setValue(index / audioFileBoxes.length * 0.75));
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.setValue(index / soundfontFileBoxes.length * 0.75));
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.setValue(1.0);
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;CACnB,GAAG,SAAS,CAAA;AAEb,yBAAiB,WAAW,CAAC;IAElB,MAAM,IAAI,GAAI,OAAM,MAAmB,KAAG,WAM/C,CAAA;IAEK,MAAM,IAAI,GAAI,MAAM,WAAW,KAAG,WAAsC,CAAA;CAClF"}
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"}
@@ -2,6 +2,7 @@ export var ProjectMeta;
2
2
  (function (ProjectMeta) {
3
3
  const created = new Date().toISOString();
4
4
  ProjectMeta.init = (name = "Untitled") => ({
5
+ artist: "",
5
6
  name,
6
7
  description: "",
7
8
  tags: [],
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectMigration.d.ts","sourceRoot":"","sources":["../../src/project/ProjectMigration.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAWxD,qBAAa,gBAAgB;IACzB,MAAM,CAAC,OAAO,CAAC,EAAC,QAAQ,EAAE,cAAc,EAAC,EAAE,eAAe,GAAG,IAAI;CAoKpE"}
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;CAgNpE"}
@@ -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
- // We need to run on a copy, because we might add more boxes during the migration
25
- boxGraph.boxes().slice().forEach(box => box.accept({
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,EAAc,MAAM,kBAAkB,CAAA;AACjD,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, 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 = Math.round(PPQN.secondsToPulses(durationInSeconds, bpm));
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 = Math.round(PPQN.secondsToPulses(durationInSeconds, bpm));
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;;CA6BJ"}