diff --git a/components/bl00mbox/buds/tinysynth/tinysynth.h b/components/bl00mbox/buds/tinysynth/tinysynth.h index aed43e16db93d03b676c89984f35a4607a82b618..54d3a05fc973038b934bd66167c037113374770f 100644 --- a/components/bl00mbox/buds/tinysynth/tinysynth.h +++ b/components/bl00mbox/buds/tinysynth/tinysynth.h @@ -7,9 +7,6 @@ #define SAMPLE_RATE 48000 -#define TRAD_OSC_DECAY_STEP 0.01 -#define TRAD_OSC_ATTACK_POP_BLOCK 16 - #define TRAD_ENV_PHASE_OFF 0 #define TRAD_ENV_PHASE_ATTACK 1 #define TRAD_ENV_PHASE_DECAY 2 @@ -23,6 +20,8 @@ #define TRAD_OSC_WAVE_SQUARE 4 #define TRAD_OSC_WAVE_PULSE 5 #define TRAD_OSC_WAVE_BLIP 6 +#define TRAD_OSC_WAVE_NES_LONG 7 +#define TRAD_OSC_WAVE_NES_SHORT 8 typedef struct { diff --git a/docs/api/bl00mbox.rst b/docs/api/bl00mbox.rst new file mode 100644 index 0000000000000000000000000000000000000000..cd7c60d80a29bbb679e0c39b5cede8c885e08a07 --- /dev/null +++ b/docs/api/bl00mbox.rst @@ -0,0 +1,106 @@ +.. py:module:: bl00mbox + + +``bl00mbox`` module +=================== + +This module provides the `tinysynth` class. With it notes can be defined and in turn played. + +.. py:class:: tinysynth + + A `tinysynth` is defined by its pitch (in Hz), waveform (sine, triangle, ... see below) and envelope (adsr, see below). + + .. py:method:: __init__(freq:int) + + Create a tinysynth and provide a frequency. + Default values: + waveform: TRAD_OSC_WAVE_TRI. + attack: 20ms + decay: 500ms + sustain: 0 + release: 500ms + + .. py:method:: start() + + Start the `tinysynth`. Essentially put it into attack phase. + + .. py:method:: stop() + + Stop the `tinysynth`. Essentially put it into release phase (which will be followed by the 'off phase'). + + .. py:method:: freq(freq) + + Set the frequency of the `tinysynth` to `freq`. + + .. py:method:: tone(tone) + + Set semitone TODO + + .. py:method:: waveform(waveform) + + Set the waveform to one of :code:`TRAD_OSC_WAVE_{SINE/FAKE_SINE/TRI/SAW/SQUARE/PULSE/BLIP/NES_LONG/NES_SHORT}`. (See below.) + + .. py:method:: attack(duration) + + Set the attack of the `tinysynth` to `duration` in milliseconds. + + .. py:method:: decay(duration) + + Set the attack of the `tinysynth` to `duration` in milliseconds. + + .. py:method:: release(duration) + + Set the attack of the `tinysynth` to `duration` in milliseconds. + + .. py:method:: sustain(level) + + Set the attack of the `tinysynth` to `level`. + TODO what is the valid value range, what does it represent? + + .. py:method:: volume(volume) + + Set the attack of the `tinysynth` to `volume`. + TODO details! + + .. py:method:: __del__() + + Deletes the `tinysynth`. + + +Event Phase Constants +--------------------- + +The phases a particular `tinysynth` can be in. + +(ATTACK -> DECAY -> SUSTAIN -> RELEASE) + +.. py:data:: TRAD_ENV_PHASE_OFF +.. py:data:: TRAD_ENV_PHASE_ATTACK +.. py:data:: TRAD_ENV_PHASE_DECAY +.. py:data:: TRAD_ENV_PHASE_SUSTAIN +.. py:data:: TRAD_ENV_PHASE_RELEASE + +Wave Form Constants +------------------- + +.. py:data:: TRAD_OSC_WAVE_SINE +.. py:data:: TRAD_OSC_WAVE_FAKE_SINE +.. py:data:: TRAD_OSC_WAVE_TRI +.. py:data:: TRAD_OSC_WAVE_SAW +.. py:data:: TRAD_OSC_WAVE_SQUARE +.. py:data:: TRAD_OSC_WAVE_PULSE +.. py:data:: TRAD_OSC_WAVE_BLIP +.. py:data:: TRAD_OSC_WAVE_NES_LONG +.. py:data:: TRAD_OSC_WAVE_NES_SHORT + + +Example Usage +------------- + +.. code-block:: python + + import bl00mbox + s = bl00mbox.tinysynth(440) + s.start() + s.stop() + diff --git a/docs/api/synth.rst b/docs/api/synth.rst deleted file mode 100644 index eaae62fb9aff5872e250bd712cab0b1b3ffc1452..0000000000000000000000000000000000000000 --- a/docs/api/synth.rst +++ /dev/null @@ -1,14 +0,0 @@ -.. py:module:: synth - -``synth`` module -================ - -.. py:class:: tinysynth - - .. py:method:: start - .. py:method:: stop - .. py:method:: freq - .. py:method:: tone - .. py:method:: waveform - .. py:method:: attack - .. py:method:: decay diff --git a/docs/index.rst b/docs/index.rst index 7f9ccbd05350bfb683549f84cd7b4e4662a9e7f8..d6d70c7df5db16693ef7b1a8c1f7dc3f0290baa2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,7 +22,7 @@ Welcome to flow3r's documentation! api/badge_link.rst api/hardware.rst api/kernel.rst - api/synth.rst + api/bl00mbox.rst api/ctx.rst diff --git a/usermodule/mp_bl00mbox.c b/usermodule/mp_bl00mbox.c index 9b492e4d2c804b12261d9465cd83d770d60f8cf5..08df59aa42d3f09189d3a685c2865eef19ecae8c 100644 --- a/usermodule/mp_bl00mbox.c +++ b/usermodule/mp_bl00mbox.c @@ -136,6 +136,20 @@ STATIC const mp_rom_map_elem_t tinysynth_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_sustain), MP_ROM_PTR(&tinysynth_sustain_obj) }, { MP_ROM_QSTR(MP_QSTR_release_ms), MP_ROM_PTR(&tinysynth_release_ms_obj) }, { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&tinysynth_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_ENV_PHASE_OFF), MP_ROM_INT(TRAD_ENV_PHASE_OFF) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_ENV_PHASE_ATTACK), MP_ROM_INT(TRAD_ENV_PHASE_ATTACK) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_ENV_PHASE_DECAY), MP_ROM_INT(TRAD_ENV_PHASE_DECAY) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_ENV_PHASE_SUSTAIN), MP_ROM_INT(TRAD_ENV_PHASE_SUSTAIN) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_ENV_PHASE_RELEASE), MP_ROM_INT(TRAD_ENV_PHASE_RELEASE) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_SINE ), MP_ROM_INT(TRAD_OSC_WAVE_SINE ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_FAKE_SINE ), MP_ROM_INT(TRAD_OSC_WAVE_FAKE_SINE ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_TRI ), MP_ROM_INT(TRAD_OSC_WAVE_TRI ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_SAW ), MP_ROM_INT(TRAD_OSC_WAVE_SAW ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_SQUARE ), MP_ROM_INT(TRAD_OSC_WAVE_SQUARE ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_PULSE ), MP_ROM_INT(TRAD_OSC_WAVE_PULSE ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_BLIP ), MP_ROM_INT(TRAD_OSC_WAVE_BLIP ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_NES_LONG ), MP_ROM_INT(TRAD_OSC_WAVE_NES_LONG ) }, + { MP_ROM_QSTR(MP_QSTR_TRAD_OSC_WAVE_NES_SHORT ), MP_ROM_INT(TRAD_OSC_WAVE_NES_SHORT ) }, }; STATIC MP_DEFINE_CONST_DICT(tinysynth_locals_dict, tinysynth_locals_dict_table);