-
-
Notifications
You must be signed in to change notification settings - Fork 59
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
$mol_audio refactor, added sample and scheduled nodes #654
Changes from 9 commits
8f48ee3
b5dbf19
1945903
dd83f2d
8ac790b
10aa7cc
25aad23
af0de3d
e711ead
ff2c04a
6fa0b7e
27bf8ce
fc89ecd
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
namespace $ { | ||
|
||
type AudioContextNode = { | ||
outStream?: InstanceType<typeof $node.stream.Writable> | null | ||
format: { | ||
numberOfChannels: number | ||
bitDepth: number | ||
} | ||
} | ||
|
||
export class $mol_audio_context_node extends $mol_audio_context { | ||
|
||
static override create_context(): AudioContext & AudioContextNode { | ||
const AudioContext = this.$.$node['web-audio-api'].AudioContext | ||
return new AudioContext() | ||
} | ||
|
||
@ $mol_memo.method | ||
static override context() { | ||
const context = this.create_context() | ||
|
||
const Speaker = this.$.$node['speaker'] | ||
|
||
context.outStream = new Speaker({ | ||
channels: context.format.numberOfChannels, | ||
bitDepth: context.format.bitDepth, | ||
sampleRate: context.sampleRate | ||
}) | ||
|
||
return context | ||
} | ||
} | ||
|
||
$.$mol_audio_context = $mol_audio_context_node | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Возможно даже так можно:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. да все-равно надо билдер опять фиксить, пока можно стаб оставить, я так и не смог найти There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Не надо тут ничего фиксить, нодовая зависимость должна динамически загружаться. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Это ж универсальная реализация. Отдельный слайс для ноды не нужен. |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
namespace $ { | ||
export class $mol_audio_context extends $mol_object2 { | ||
static create_context() { | ||
return new this.$.$mol_dom_context.AudioContext() | ||
} | ||
|
||
@ $mol_memo.method | ||
static context() { | ||
return this.create_context() | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
namespace $ { | ||
|
||
export class $mol_audio_gain extends $mol_audio_node { | ||
|
||
@ $mol_mem | ||
override node_raw() { return this.context().createGain() } | ||
|
||
@ $mol_mem | ||
override node() { | ||
const node = super.node() | ||
node.gain.setValueAtTime( this.gain(), this.time() ) | ||
return node | ||
} | ||
|
||
@ $mol_mem | ||
gain( next = 1 ) { return next } | ||
|
||
} | ||
|
||
} |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
namespace $ { | ||
export class $mol_audio_instrument extends $mol_audio_node { | ||
override node_raw(): AudioScheduledSourceNode { | ||
throw new Error('implement') | ||
} | ||
|
||
@ $mol_mem | ||
override node() { | ||
const node = super.node() | ||
node.onended = $mol_wire_async((e: Event) => this.end(e)) | ||
|
||
return node | ||
} | ||
|
||
protected promise = $mol_promise<void>() | ||
|
||
@ $mol_mem | ||
wait() { | ||
return this.promise | ||
} | ||
|
||
end(e: Event) { | ||
this.active( false ) | ||
} | ||
|
||
@ $mol_mem | ||
active( next?: boolean ): boolean { | ||
|
||
$mol_wire_solid() | ||
|
||
const node = next === false ? this.node_raw() : this.node() | ||
|
||
const prev = $mol_wire_probe( ()=> this.active() ) | ||
if( prev === next ) return next ?? false | ||
|
||
if( next === true ) { | ||
node.start() | ||
} else if( prev === true ) { | ||
node.stop() | ||
this.promise.done() | ||
this.promise = $mol_promise() | ||
} | ||
|
||
return next ?? false | ||
} | ||
|
||
override destructor() { | ||
this.active( false ) | ||
super.destructor() | ||
} | ||
|
||
@ $mol_mem | ||
override output() { | ||
this.active( true ) | ||
return super.output() | ||
} | ||
|
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
namespace $ { | ||
export class $mol_audio_sample extends $mol_audio_instrument { | ||
@ $mol_mem | ||
override node_raw() { return this.context().createBufferSource() } | ||
|
||
override duration() { | ||
return this.audio_buffer().duration | ||
} | ||
|
||
buffer() { | ||
return new ArrayBuffer(0) | ||
} | ||
|
||
@ $mol_mem | ||
audio_buffer() { | ||
return $mol_wire_sync(this.context()).decodeAudioData(this.buffer()) | ||
} | ||
|
||
@ $mol_mem | ||
override node() { | ||
const node = super.node() | ||
node.buffer = this.audio_buffer() | ||
|
||
return node | ||
} | ||
|
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
namespace $ { | ||
|
||
export type $mol_audio_vibe_shape = | ||
| 'sine' | ||
| 'square' | ||
| 'sawtooth' | ||
| 'triangle' | ||
| 'custom' | ||
|
||
/** | ||
* @see https://mol.hyoo.ru/#!section=demos/demo=mol_audio_demo_vibe | ||
*/ | ||
export class $mol_audio_vibe extends $mol_audio_instrument { | ||
|
||
@ $mol_mem | ||
override node_raw() { return this.context().createOscillator() } | ||
|
||
@ $mol_mem | ||
freq( next = 440 ) { return next } | ||
|
||
@ $mol_mem | ||
shape( next: $mol_audio_vibe_shape = 'sine' ) { return next } | ||
|
||
override duration() { | ||
return 0.5 | ||
} | ||
|
||
@ $mol_mem | ||
override node() { | ||
const node = super.node() | ||
node.frequency.setValueAtTime( this.freq(), this.time() ) | ||
node.type = this.shape() | ||
|
||
return node | ||
} | ||
|
||
} | ||
} |
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.