From c688e0e819309a8291bdaee9f1c7f7988c8315dd Mon Sep 17 00:00:00 2001 From: jdah <20308439+jdah@users.noreply.github.com> Date: Thu, 22 Apr 2021 10:01:40 +0200 Subject: [PATCH] Added music enable #define, made theme full AABA --- bin/bootsect.bin | Bin 512 -> 0 bytes bin/kernel.bin | Bin 37152 -> 0 bytes src/main.c | 17 ++++++++++++++--- src/music.c | 38 ++++++++++++++++++++------------------ 4 files changed, 34 insertions(+), 21 deletions(-) delete mode 100755 bin/bootsect.bin delete mode 100755 bin/kernel.bin diff --git a/bin/bootsect.bin b/bin/bootsect.bin deleted file mode 100755 index afe78312c02034fd85b374cf184f4dafc4ba6f51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmey>bE5A?-+{gdeJ}bh>|rqI5c^j1d*9uf7h4#1iZFDEeXH5`qvklhJoSH-7O3ogwG26dJ)R7;li_&7m*Bx z2c9GZyl`XKaPe8n3wwr$<`YcM68IGkq&1&lb;&kXL0P1La?*IS* diff --git a/bin/kernel.bin b/bin/kernel.bin deleted file mode 100755 index 8a974262810d054588dfb458d96fe7391e3a531b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37152 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 diff --git a/src/main.c b/src/main.c index 7783c28..b88072c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,6 @@ +// remove to disable music, useful when building for hardware without an SB16 +#define ENABLE_MUSIC + #include "util.h" #include "screen.h" #include "idt.h" @@ -9,8 +12,11 @@ #include "keyboard.h" #include "speaker.h" #include "fpu.h" + +#ifdef ENABLE_MUSIC #include "sound.h" #include "music.h" +#endif #define FPS 30 #define LEVELS 30 @@ -694,14 +700,17 @@ void _main(u32 magic) { screen_init(); timer_init(); keyboard_init(); - sound_init(); generate_sprites(); + +#ifdef ENABLE_MUSIC + sound_init(); music_init(); + state.music = true; + sound_master(255); +#endif state.menu = true; - state.music = true; - sound_master(255); bool last_music_toggle = false; u32 last_frame = 0, last = 0; @@ -709,10 +718,12 @@ void _main(u32 magic) { while (true) { const u32 now = (u32) timer_get(); +#ifdef ENABLE_MUSIC if (now != last) { music_tick(); last = now; } +#endif if ((now - last_frame) > (TIMER_TPS / FPS)) { last_frame = now; diff --git a/src/music.c b/src/music.c index 9865812..64c7a65 100644 --- a/src/music.c +++ b/src/music.c @@ -295,7 +295,7 @@ static const struct Note BRIDGE_SNARE[] = { SNARE_EIGTH, }; -#define TRACK_MAX_LENGTH (4 * (CHORUS_MELODY_LENGTH + BRIDGE_MELODY_LENGTH)) +#define TRACK_MAX_LENGTH (4 * (CHORUS_MELODY_LENGTH * 3 + BRIDGE_MELODY_LENGTH + 1)) #define TRACK_PARTS 4 static struct Note TRACK[TRACK_PARTS][TRACK_MAX_LENGTH]; static size_t PART_LENGTHS[TRACK_PARTS]; @@ -318,7 +318,7 @@ void music_tick() { } // remove last tick to give each note an attack - if (current[i].ticks == 1) { + if (current[i].ticks <= 1) { sound_note(i, OCTAVE_1, NOTE_NONE); } } @@ -329,29 +329,31 @@ void music_init() { sound_volume(0, 255); sound_wave(1, WAVE_NOISE); - sound_volume(1, 0); + sound_volume(1, 128); sound_wave(2, WAVE_TRIANGLE); - sound_volume(2, 0); + sound_volume(2, 196); sound_wave(3, WAVE_TRIANGLE); - sound_volume(3, 0); + sound_volume(3, 196); - memcpy(&TRACK[0][0], CHORUS_MELODY, sizeof(CHORUS_MELODY)); - memcpy(&TRACK[0][CHORUS_MELODY_LENGTH], BRIDGE_MELODY, sizeof(BRIDGE_MELODY)); - PART_LENGTHS[0] = CHORUS_MELODY_LENGTH + BRIDGE_MELODY_LENGTH; + // AABA part +#define PART(_i, _c, _b) do { \ + size_t cs = sizeof(_c) / sizeof(_c[0]), \ + bs = sizeof(_b) / sizeof(_b[0]), \ + n = 0; \ + memcpy(&TRACK[_i][n], _c, sizeof(_c)); n += cs; \ + memcpy(&TRACK[_i][n], _c, sizeof(_c)); n += cs; \ + memcpy(&TRACK[_i][n], _b, sizeof(_b)); n += bs; \ + memcpy(&TRACK[_i][n], _c, sizeof(_c)); \ + PART_LENGTHS[_i] = cs * 3 + bs; \ + } while (0); - memcpy(&TRACK[1][0], CHORUS_SNARE, sizeof(CHORUS_SNARE)); - memcpy(&TRACK[1][CHORUS_SNARE_LENGTH], BRIDGE_SNARE, sizeof(BRIDGE_SNARE)); - PART_LENGTHS[1] = CHORUS_SNARE_LENGTH + BRIDGE_SNARE_LENGTH; + PART(0, CHORUS_MELODY, BRIDGE_MELODY); + PART(1, CHORUS_SNARE, BRIDGE_SNARE); + PART(2, CHORUS_BASS, BRIDGE_BASS); + PART(3, CHORUS_HARMONY, BRIDGE_HARMONY); - memcpy(&TRACK[2][0], CHORUS_BASS, sizeof(CHORUS_BASS)); - memcpy(&TRACK[2][CHORUS_BASS_LENGTH], BRIDGE_BASS, sizeof(BRIDGE_BASS)); - PART_LENGTHS[2] = CHORUS_BASS_LENGTH + BRIDGE_BASS_LENGTH; - - memcpy(&TRACK[3][0], CHORUS_HARMONY, sizeof(CHORUS_HARMONY)); - memcpy(&TRACK[3][CHORUS_HARMONY_LENGTH], BRIDGE_HARMONY, sizeof(BRIDGE_HARMONY)); - PART_LENGTHS[3] = CHORUS_HARMONY_LENGTH + BRIDGE_HARMONY_LENGTH; for (size_t i = 0; i < TRACK_PARTS; i++) { indices[i] = -1;