An attempt at making an audio synthesizer in Elixir.
The Source.Timer module provides a time source for audio signal. It periodically notifies the Sequence.Range which creates a series of time values.
By default:
* The Source.Timer generates an event notification every 10 ms.
* The Sequence.Range generates 441 time events with interval of 0.000022675736961451248.
The result is a sequence of time events representing 44100 Hz.
An Oscillator is notified with a time, and creates a signal event. The supported oscillators are:
* Square
* Saw
* Triangle
* Sine
For CD-quality audio:
- the sample rate is 44,100 samples per second.
- has a sample size of 16 bits
- has 2 channels
The common range of human hearing is 20 Hz to 20 kHz. Humans can hear as low as 12 Hz.
1/44100 second/samples = 0.000022675736961451248 second/sample ~= 23 microsecond/sample
(0.001 second) / (0.000023 second/sample) = 43.47826086956522 samples ~= 43 samples
The Erlang timer is only accurate to 1 millisecond. Erlang rem function only works on integers. :math.sin/1 is the Erlang sine function
The base time unit will be 1 microsecond. This allows many of the calculations to be performed as integers.
If available in Hex, the package can be installed as:
-
Add oscillixir to your list of dependencies in
mix.exs
:def deps do [{:oscillixir, "~> 0.0.1"}] end
-
Ensure oscillixir is started before your application:
def application do [applications: [:oscillixir]] end