From 1bb675d15814070b29d24450095273266aa56c43 Mon Sep 17 00:00:00 2001 From: veclavtalica Date: Mon, 24 Jun 2024 16:28:19 +0300 Subject: [PATCH] full chromatic scale, fix regression of crossfading, second row of keys --- Source/Instruments/Trojka/trojka.c | 7 ++- Source/Maker/Build/stfu-maker.exe | Bin 154112 -> 153600 bytes Source/Maker/main.c | 98 ++++++++++++++++++++++++----- Source/config.h | 2 + readme.md | 2 +- 5 files changed, 91 insertions(+), 18 deletions(-) diff --git a/Source/Instruments/Trojka/trojka.c b/Source/Instruments/Trojka/trojka.c index fda1bc7..ee2caae 100644 --- a/Source/Instruments/Trojka/trojka.c +++ b/Source/Instruments/Trojka/trojka.c @@ -15,8 +15,9 @@ struct stfu_trojka { struct stfu_phaser phasers[STFU_TROJKA_OP_COUNT]; struct stfu_envelope envelopes[STFU_TROJKA_OP_COUNT]; - float gains[STFU_TROJKA_OP_COUNT]; + float gains[STFU_TROJKA_OP_COUNT]; // todo: Combine with indices? float freq_scales[STFU_TROJKA_OP_COUNT]; + float indices[STFU_TROJKA_OP_COUNT - 1]; /* 1 to 100 */ float key_frequency; float feedback_gain; // todo: Separate gain for channels? float left_feedback, right_feedback; @@ -28,8 +29,8 @@ static struct stfu_trojka stfu_sample_trojka(struct stfu_trojka synth, float buf synth.envelopes[i] = stfu_pump_envelope(synth.envelopes[i]); } - float left_modulator_stack = synth.envelopes[1].v * sinf(synth.phasers[1].v + synth.envelopes[0].v * sinf(synth.phasers[0].v)) + synth.left_feedback * synth.feedback_gain; - float right_modulator_stack = synth.envelopes[1].v * sinf(synth.phasers[1].v + synth.envelopes[0].v * sinf(synth.phasers[0].v)) + synth.right_feedback * synth.feedback_gain; + float left_modulator_stack = synth.envelopes[1].v * synth.indices[1] * sinf(synth.phasers[1].v + synth.envelopes[0].v * synth.indices[0] * sinf(synth.phasers[0].v)) + synth.left_feedback * synth.feedback_gain; + float right_modulator_stack = left_modulator_stack; synth.left_feedback = left_modulator_stack; synth.right_feedback = right_modulator_stack; diff --git a/Source/Maker/Build/stfu-maker.exe b/Source/Maker/Build/stfu-maker.exe index 1ab8eb787b8c1fe621719e5ee1ff93fb9d4e7467..6a8aa9ad6f98c9e0250ef4a44337bf7c1e1d12e4 100644 GIT binary patch delta 31988 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 bK&2`!VeX`v@$)9mh)+n$%^#*Tsr|nI$};DK delta 32740 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 diff --git a/Source/Maker/main.c b/Source/Maker/main.c index e196977..d116fc8 100644 --- a/Source/Maker/main.c +++ b/Source/Maker/main.c @@ -24,6 +24,9 @@ static float crossfade_ring[CROSSFADE_RING_RANGE] = {0}; static size_t crossfade_ring_needle = 0; static unsigned int crossfade_frames_left = 0; +// 1.0 is with A at 440 +static float octave = 0.5; + static void stream(float *buffer, int num_frames, int num_channels) { /* Fade away */ for (size_t i = 0; crossfade_frames_left > 0; @@ -53,10 +56,15 @@ static void init(void) { // .stream_cb = stream, }); - synth.phasers[0] = stfu_init_phaser(220); - synth.phasers[1] = stfu_init_phaser(220 * 0.25); - synth.phasers[2] = stfu_init_phaser(220 * 2.0); + synth.freq_scales[0] = 1.0; + synth.freq_scales[1] = 0.25; + synth.freq_scales[2] = 2.0; + + synth.indices[0] = 2.0; + synth.indices[1] = 10.0; + synth.feedback_gain = 0.25; + for (int i = 0; i < STFU_TROJKA_OP_COUNT; ++i) { synth.envelopes[i] = stfu_init_envelope( (struct stfu_envelope_point[]){[0] = {.dur = 0.02, .vol = 1.0}, @@ -64,7 +72,6 @@ static void init(void) { [2] = {.dur = 1.0, .vol = 0}}, 3); synth.gains[i] = 1.0; - synth.freq_scales[i] = 1.0; } } @@ -76,40 +83,103 @@ static void event(const sapp_event *e) { if (e->key_repeat) break; + bool key_was_pressed = false; + switch (e->key_code) { case SAPP_KEYCODE_Z: - synth = stfu_press_trojka(synth, STFU_SCALE[0]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[0] * octave); + break; case SAPP_KEYCODE_X: - synth = stfu_press_trojka(synth, STFU_SCALE[1]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[1] * octave); break; case SAPP_KEYCODE_C: - synth = stfu_press_trojka(synth, STFU_SCALE[2]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[2] * octave); break; case SAPP_KEYCODE_V: - synth = stfu_press_trojka(synth, STFU_SCALE[3]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[3] * octave); break; case SAPP_KEYCODE_B: - synth = stfu_press_trojka(synth, STFU_SCALE[4]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[4] * octave); break; case SAPP_KEYCODE_N: - synth = stfu_press_trojka(synth, STFU_SCALE[5]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[5] * octave); break; case SAPP_KEYCODE_M: - synth = stfu_press_trojka(synth, STFU_SCALE[6]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[6] * octave); break; case SAPP_KEYCODE_COMMA: - synth = stfu_press_trojka(synth, STFU_SCALE[7]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[7] * octave); break; case SAPP_KEYCODE_PERIOD: - synth = stfu_press_trojka(synth, STFU_SCALE[8]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[8] * octave); break; case SAPP_KEYCODE_SLASH: - synth = stfu_press_trojka(synth, STFU_SCALE[9]); + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[9] * octave); break; + + case SAPP_KEYCODE_A: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[0] * (octave * 2)); + break; + case SAPP_KEYCODE_S: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[1] * (octave * 2)); + break; + case SAPP_KEYCODE_D: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[2] * (octave * 2)); + break; + case SAPP_KEYCODE_F: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[3] * (octave * 2)); + break; + case SAPP_KEYCODE_G: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[4] * (octave * 2)); + break; + case SAPP_KEYCODE_H: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[5] * (octave * 2)); + break; + case SAPP_KEYCODE_J: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[6] * (octave * 2)); + break; + case SAPP_KEYCODE_K: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[7] * (octave * 2)); + break; + case SAPP_KEYCODE_L: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[8] * (octave * 2)); + break; + case SAPP_KEYCODE_SEMICOLON: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[9] * (octave * 2)); + break; + case SAPP_KEYCODE_APOSTROPHE: + key_was_pressed = true; + synth = stfu_press_trojka(synth, STFU_SCALE[10] * (octave * 2)); + break; + default: break; } + if (key_was_pressed) { + crossfade_frames_left = STFU_CROSSFADE_BUFFER_FRAMES; + } + break; } default: diff --git a/Source/config.h b/Source/config.h index 60af47c..2ded0a6 100644 --- a/Source/config.h +++ b/Source/config.h @@ -33,6 +33,8 @@ static const float STFU_SCALE[12] = { STFU_NOTE_DOWNSCALE_FACTOR, STFU_A4_FREQUENCY * STFU_NOTE_DOWNSCALE_FACTOR, STFU_A4_FREQUENCY, + STFU_A4_FREQUENCY * STFU_NOTE_UPSCALE_FACTOR, + STFU_A4_FREQUENCY * STFU_NOTE_UPSCALE_FACTOR * STFU_NOTE_UPSCALE_FACTOR, }; #endif diff --git a/readme.md b/readme.md index c7270a5..149f671 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,5 @@ # STFU ! SoundTracker Format Unirepo -Grassroot music format specifically designed for lofi game soundtracks with accent on binary efficiency in its various forms. +Grassroot music format specifically designed for reproducible lofi game soundtracks with accent on binary efficiency in its various forms. - Separation of Maker and Player binaries, with Player being absolutely dependency free. - Samples and instruments are stored outside of tracks in a shared data base allowing reuse.