blob: 5e00379338bec57062ff381479e103cf3c83dd0b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
* Mono Synth MVP
A Rust library that drives a GDNative script and exposes an interface for a
monophonic Synth object. This object will produce audio frames which will
fill Godot's ~AudioStreamPlayback~ buffer, leveraging the cross-platform
audio I/O that Godot provides. The Rust dynamic library will need to be built
for each platform, but it will leverage Rust's perfomance optimizations to
enable realtime audio interactions.
** Godot Synth Interface
From Godot, we're primarily interested in manipulating various aspects of
the Mono Synth. Frequency, modulation, amplitude, and any other expressive
aspect of a single tone we can hook up. Overall volume will be controlled
by Godot.
*** Input
- *Sample Rate* - Godot must send its I/O sample rate to the synth when initialized
This is the number of audio samples played back per second. So we need to generate
samples at the same rate.
- *Frequency* - range from 20Hz to ½ the sample rate. increment may need to change
over the range. Human ear detects small changes at lower frequencies, but not as
much in the higher frequencies.
- *Continuous* - whether or not to produce a continuous tone or use ADSR envelope
- *Waveform* - a selection of basic waveforms will be implemented in Rust. We can
control which one is being generated via a switch in Godot.
- *Phasor* - the shape of the waveform can be dynamically modified by changing the
shape of the phasor driving the oscillator. Given an (x,y) vector, the shape of
the phasor can be "bent" away from it smooth 0-1 slope.
- *Amplitude Envelope* - this controls the volume of sound over time. Typical envelopes
have parameters for:
- *Attack* - amount of time before the waveform is at its peak
- *Decay* - amount of time it takes to go from peak to sustained level
- *Sustain* - the level (amplitude) to sustain while a note is held
- *Release* - the amount of time to go to 0 from sustain when note is released
- *Filter* - a low pass filter with a two parameters:
- *Cutoff* the frequency where the filter begins
- *Resonance* ? i think its like an amplitude boost at the cutoff?
- *Modulator* - a low frequency oscillator that can effect the frequency or filter cutoff
*** Output
Currently, the output is an array of (sample, sample) vectors, where each sample is
a float between -1.0 and 1.0. You can request a certain number of frames, and get back
the calculated samples to fill them. We can think of this as essentially the stereo
audio jack from a synthesizer.
|