Skip to content

Commit

Permalink
Assign PCM samples to MIDI keys
Browse files Browse the repository at this point in the history
  • Loading branch information
rhargreaves committed Sep 7, 2024
1 parent a817c38 commit 8d2fb7b
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 15 deletions.
5 changes: 4 additions & 1 deletion src/midi_dac.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@

void midi_dac_note_on(u8 chan, u8 pitch, s8 cents, u8 velocity)
{
const PcmSample* sample = percussionPcmSample[0];
const PcmSample* sample = percussionPcmSample[pitch];
if (!sample) {
return;
}
SND_PCM_startPlay(sample->data, sample->length, sample->rate, SOUND_PAN_CENTER, 0);
}

Expand Down
111 changes: 100 additions & 11 deletions src/pcm_sample.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,105 @@
#include "snd/sound.h"
#include "snd/pcm/snd_pcm.h"

// clang-format off
static const PcmSample bellride = { pcm_BellRide, sizeof(pcm_BellRide), SOUND_PCM_RATE_22050 };
static const PcmSample belltree = { pcm_BellTree, sizeof(pcm_BellTree), SOUND_PCM_RATE_22050 };
static const PcmSample bongorim = { pcm_BongoRim, sizeof(pcm_BongoRim), SOUND_PCM_RATE_22050 };
static const PcmSample cabasa = { pcm_Cabasa, sizeof(pcm_Cabasa), SOUND_PCM_RATE_22050 };
static const PcmSample castanet = { pcm_Castanet, sizeof(pcm_Castanet), SOUND_PCM_RATE_22050 };
static const PcmSample chinacrash = { pcm_ChinaCrash, sizeof(pcm_ChinaCrash), SOUND_PCM_RATE_22050 };
static const PcmSample clap = { pcm_Clap, sizeof(pcm_Clap), SOUND_PCM_RATE_22050 };
static const PcmSample clave = { pcm_Clave, sizeof(pcm_Clave), SOUND_PCM_RATE_22050 };
static const PcmSample closedslap = { pcm_ClosedSlap, sizeof(pcm_ClosedSlap), SOUND_PCM_RATE_22050 };
static const PcmSample cowbell = { pcm_CowBell, sizeof(pcm_CowBell), SOUND_PCM_RATE_22050 };
static const PcmSample crsh1 = { pcm_Crsh1, sizeof(pcm_Crsh1), SOUND_PCM_RATE_22050 };
static const PcmSample crsh2 = { pcm_Crsh2, sizeof(pcm_Crsh2), SOUND_PCM_RATE_22050 };
static const PcmSample flrstudio = { pcm_FlrStudio, sizeof(pcm_FlrStudio), SOUND_PCM_RATE_22050 };
static const PcmSample guirodown = { pcm_GuiroDown, sizeof(pcm_GuiroDown), SOUND_PCM_RATE_22050 };
static const PcmSample guiroup = { pcm_GuiroUp, sizeof(pcm_GuiroUp), SOUND_PCM_RATE_22050 };
static const PcmSample histudio = { pcm_HiStudio, sizeof(pcm_HiStudio), SOUND_PCM_RATE_22050 };
static const PcmSample hi_hatclosed = { pcm_Hi_HatClosed, sizeof(pcm_Hi_HatClosed), SOUND_PCM_RATE_22050 };
static const PcmSample hi_hatfoot = { pcm_Hi_HatFoot, sizeof(pcm_Hi_HatFoot), SOUND_PCM_RATE_22050 };
static const PcmSample hi_hathalf_open = { pcm_Hi_HatHalf_Open, sizeof(pcm_Hi_HatHalf_Open), SOUND_PCM_RATE_22050 };
static const PcmSample highagogo = { pcm_HighAgogo, sizeof(pcm_HighAgogo), SOUND_PCM_RATE_22050 };
static const PcmSample highconga = { pcm_HighConga, sizeof(pcm_HighConga), SOUND_PCM_RATE_22050 };
static const PcmSample highq = { pcm_HighQ, sizeof(pcm_HighQ), SOUND_PCM_RATE_22050 };
static const PcmSample hightimbale = { pcm_HighTimbale, sizeof(pcm_HighTimbale), SOUND_PCM_RATE_22050 };
static const PcmSample highwoodblock = { pcm_HighWoodblock, sizeof(pcm_HighWoodblock), SOUND_PCM_RATE_22050 };
static const PcmSample longtaikohit = { pcm_LongTaikoHit, sizeof(pcm_LongTaikoHit), SOUND_PCM_RATE_22050 };
static const PcmSample longwhistle = { pcm_LongWhistle, sizeof(pcm_LongWhistle), SOUND_PCM_RATE_22050 };
static const PcmSample lowagogo = { pcm_LowAgogo, sizeof(pcm_LowAgogo), SOUND_PCM_RATE_22050 };
static const PcmSample lowbongo = { pcm_LowBongo, sizeof(pcm_LowBongo), SOUND_PCM_RATE_22050 };
static const PcmSample lowflrstudio = { pcm_LowFlrStudio, sizeof(pcm_LowFlrStudio), SOUND_PCM_RATE_22050 };
static const PcmSample lowstudio = { pcm_LowStudio, sizeof(pcm_LowStudio), SOUND_PCM_RATE_22050 };
static const PcmSample lowtimbale = { pcm_LowTimbale, sizeof(pcm_LowTimbale), SOUND_PCM_RATE_22050 };
static const PcmSample lowtumba = { pcm_LowTumba, sizeof(pcm_LowTumba), SOUND_PCM_RATE_22050 };
static const PcmSample lowwoodblock = { pcm_LowWoodblock, sizeof(pcm_LowWoodblock), SOUND_PCM_RATE_22050 };
static const PcmSample maracas = { pcm_Maracas, sizeof(pcm_Maracas), SOUND_PCM_RATE_22050 };
static const PcmSample mdhistudio = { pcm_MdHiStudio, sizeof(pcm_MdHiStudio), SOUND_PCM_RATE_22050 };
static const PcmSample mdstudio = { pcm_MdStudio, sizeof(pcm_MdStudio), SOUND_PCM_RATE_22050 };
static const PcmSample metronomebell = { pcm_MetronomeBell, sizeof(pcm_MetronomeBell), SOUND_PCM_RATE_22050 };
static const PcmSample metronomeclick = { pcm_MetronomeClick, sizeof(pcm_MetronomeClick), SOUND_PCM_RATE_22050 };
// static const PcmSample piccolo1_1 = { pcm_Piccolo1_1, sizeof(pcm_Piccolo1_1), SOUND_PCM_RATE_22050 };
// static const PcmSample piccolo1_2 = { pcm_Piccolo1_2, sizeof(pcm_Piccolo1_2), SOUND_PCM_RATE_22050 };
static const PcmSample quicahi = { pcm_QuicaHi, sizeof(pcm_QuicaHi), SOUND_PCM_RATE_22050 };
static const PcmSample quicalow = { pcm_QuicaLow, sizeof(pcm_QuicaLow), SOUND_PCM_RATE_22050 };
static const PcmSample ride1 = { pcm_Ride1, sizeof(pcm_Ride1), SOUND_PCM_RATE_22050 };
static const PcmSample ride2 = { pcm_Ride2, sizeof(pcm_Ride2), SOUND_PCM_RATE_22050 };
static const PcmSample rimtap = { pcm_RimTap, sizeof(pcm_RimTap), SOUND_PCM_RATE_22050 };
static const PcmSample scratchpull = { pcm_ScratchPull, sizeof(pcm_ScratchPull), SOUND_PCM_RATE_22050 };
static const PcmSample scratchpush = { pcm_ScratchPush, sizeof(pcm_ScratchPush), SOUND_PCM_RATE_22050 };
static const PcmSample shorttaikohit = { pcm_ShortTaikoHit, sizeof(pcm_ShortTaikoHit), SOUND_PCM_RATE_22050 };
static const PcmSample shortwhistle = { pcm_ShortWhistle, sizeof(pcm_ShortWhistle), SOUND_PCM_RATE_22050 };
static const PcmSample slap = { pcm_Slap, sizeof(pcm_Slap), SOUND_PCM_RATE_22050 };
static const PcmSample sleighbells = { pcm_SleighBells, sizeof(pcm_SleighBells), SOUND_PCM_RATE_22050 };
static const PcmSample smallshaker = { pcm_SmallShaker, sizeof(pcm_SmallShaker), SOUND_PCM_RATE_22050 };
// static const PcmSample snr1_1 = { pcm_Snr1_1, sizeof(pcm_Snr1_1), SOUND_PCM_RATE_22050 };
// static const PcmSample snr1_2 = { pcm_Snr1_2, sizeof(pcm_Snr1_2), SOUND_PCM_RATE_22050 };
// static const PcmSample snr2_1 = { pcm_Snr2_1, sizeof(pcm_Snr2_1), SOUND_PCM_RATE_22050 };
// static const PcmSample snr2_2 = { pcm_Snr2_2, sizeof(pcm_Snr2_2), SOUND_PCM_RATE_22050 };
static const PcmSample splash = { pcm_Splash, sizeof(pcm_Splash), SOUND_PCM_RATE_22050 };
static const PcmSample squareclick = { pcm_SquareClick, sizeof(pcm_SquareClick), SOUND_PCM_RATE_22050 };
static const PcmSample stdkick = { pcm_StdKick, sizeof(pcm_StdKick), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick1 = { pcm_StdKick1, sizeof(pcm_StdKick1), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick2 = { pcm_StdKick2, sizeof(pcm_StdKick2), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick3 = { pcm_StdKick3, sizeof(pcm_StdKick3), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick4 = { pcm_StdKick4, sizeof(pcm_StdKick4), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick5 = { pcm_StdKick5, sizeof(pcm_StdKick5), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick6 = { pcm_StdKick6, sizeof(pcm_StdKick6), SOUND_PCM_RATE_22050 };
// static const PcmSample stdkick7 = { pcm_StdKick7, sizeof(pcm_StdKick7), SOUND_PCM_RATE_22050 };
static const PcmSample stdsnr1 = { pcm_StdSnr1, sizeof(pcm_StdSnr1), SOUND_PCM_RATE_22050 };
static const PcmSample stdsnr2 = { pcm_StdSnr2, sizeof(pcm_StdSnr2), SOUND_PCM_RATE_22050 };
static const PcmSample sticks = { pcm_Sticks, sizeof(pcm_Sticks), SOUND_PCM_RATE_22050 };
static const PcmSample tambourine = { pcm_Tambourine, sizeof(pcm_Tambourine), SOUND_PCM_RATE_22050 };
static const PcmSample triangle = { pcm_Triangle, sizeof(pcm_Triangle), SOUND_PCM_RATE_22050 };
static const PcmSample vibraslap = { pcm_VibraSlap, sizeof(pcm_VibraSlap), SOUND_PCM_RATE_22050 };

const PcmSample* percussionPcmSample[128]
= { &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap,
&clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap, &clap };
const PcmSample* percussionPcmSample[128] = {
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, // 25
NULL, &highq, &slap, &scratchpush, &scratchpull,
&sticks, &squareclick, &metronomeclick, &metronomebell, &stdkick,
&stdkick, &rimtap, &stdsnr1, &clap, &stdsnr2,
&lowflrstudio, &hi_hatclosed, &flrstudio, &hi_hatfoot, &lowstudio,
&hi_hathalf_open, &mdstudio, &mdhistudio, &crsh1, &histudio, // 50
&ride1, &chinacrash, &bellride, &tambourine, &splash,
&cowbell, &crsh2, &vibraslap, &ride2, &bongorim,
&lowbongo, &closedslap, &highconga, &lowtumba, &hightimbale,
&lowtimbale, &highagogo, &lowagogo, &cabasa, &maracas,
&shortwhistle, &longwhistle, &guirodown, &guiroup, &clave, // 75
&highwoodblock, &lowwoodblock, &quicahi, &quicalow, &triangle,
&triangle, &smallshaker, &sleighbells, &belltree, &castanet,
&shorttaikohit, &longtaikohit, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, // 100
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL
};
71 changes: 71 additions & 0 deletions tests/fake_res.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,75 @@ const Image img_megawifi_connected = {};
const Image img_megawifi_detected = {};
const Image img_megawifi_not_detected = {};
const Image img_megawifi_listening = {};
const u8 pcm_BellRide[0] = {};
const u8 pcm_BellTree[0] = {};
const u8 pcm_BongoRim[0] = {};
const u8 pcm_Cabasa[0] = {};
const u8 pcm_Castanet[0] = {};
const u8 pcm_ChinaCrash[0] = {};
const u8 pcm_Clap[0] = {};
const u8 pcm_Clave[0] = {};
const u8 pcm_ClosedSlap[0] = {};
const u8 pcm_CowBell[0] = {};
const u8 pcm_Crsh1[0] = {};
const u8 pcm_Crsh2[0] = {};
const u8 pcm_FlrStudio[0] = {};
const u8 pcm_GuiroDown[0] = {};
const u8 pcm_GuiroUp[0] = {};
const u8 pcm_HiStudio[0] = {};
const u8 pcm_Hi_HatClosed[0] = {};
const u8 pcm_Hi_HatFoot[0] = {};
const u8 pcm_Hi_HatHalf_Open[0] = {};
const u8 pcm_HighAgogo[0] = {};
const u8 pcm_HighConga[0] = {};
const u8 pcm_HighQ[0] = {};
const u8 pcm_HighTimbale[0] = {};
const u8 pcm_HighWoodblock[0] = {};
const u8 pcm_LongTaikoHit[0] = {};
const u8 pcm_LongWhistle[0] = {};
const u8 pcm_LowAgogo[0] = {};
const u8 pcm_LowBongo[0] = {};
const u8 pcm_LowFlrStudio[0] = {};
const u8 pcm_LowStudio[0] = {};
const u8 pcm_LowTimbale[0] = {};
const u8 pcm_LowTumba[0] = {};
const u8 pcm_LowWoodblock[0] = {};
const u8 pcm_Maracas[0] = {};
const u8 pcm_MdHiStudio[0] = {};
const u8 pcm_MdStudio[0] = {};
const u8 pcm_MetronomeBell[0] = {};
const u8 pcm_MetronomeClick[0] = {};
const u8 pcm_Piccolo1_1[0] = {};
const u8 pcm_Piccolo1_2[0] = {};
const u8 pcm_QuicaHi[0] = {};
const u8 pcm_QuicaLow[0] = {};
const u8 pcm_Ride1[0] = {};
const u8 pcm_Ride2[0] = {};
const u8 pcm_RimTap[0] = {};
const u8 pcm_ScratchPull[0] = {};
const u8 pcm_ScratchPush[0] = {};
const u8 pcm_ShortTaikoHit[0] = {};
const u8 pcm_ShortWhistle[0] = {};
const u8 pcm_Slap[0] = {};
const u8 pcm_SleighBells[0] = {};
const u8 pcm_SmallShaker[0] = {};
const u8 pcm_Snr1_1[0] = {};
const u8 pcm_Snr1_2[0] = {};
const u8 pcm_Snr2_1[0] = {};
const u8 pcm_Snr2_2[0] = {};
const u8 pcm_Splash[0] = {};
const u8 pcm_SquareClick[0] = {};
const u8 pcm_StdKick[0] = {};
const u8 pcm_StdKick1[0] = {};
const u8 pcm_StdKick2[0] = {};
const u8 pcm_StdKick3[0] = {};
const u8 pcm_StdKick4[0] = {};
const u8 pcm_StdKick5[0] = {};
const u8 pcm_StdKick6[0] = {};
const u8 pcm_StdKick7[0] = {};
const u8 pcm_StdSnr1[0] = {};
const u8 pcm_StdSnr2[0] = {};
const u8 pcm_Sticks[0] = {};
const u8 pcm_Tambourine[0] = {};
const u8 pcm_Triangle[0] = {};
const u8 pcm_VibraSlap[0] = {};
1 change: 1 addition & 0 deletions tests/unit/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ int main(void)

midi_dac_test(test_midi_dac_plays_note),
midi_dac_test(test_midi_dac_stops_note),
midi_dac_test(test_midi_dac_does_not_play_null_sample),

pitchcents_test(test_pitchcents_shift_extreme_up),
pitchcents_test(test_pitchcents_bend_nil),
Expand Down
15 changes: 12 additions & 3 deletions tests/unit/test_midi_dac.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
#include "snd/sound.h"
#include "snd/pcm/snd_pcm.h"

static const u8 noteKey = 39;
static const u8 nullNoteKey = 1;
static const u8 dacFmChannel = 5;

static int test_midi_dac_setup(UNUSED void** state)
{
test_midi_setup(state);
Expand Down Expand Up @@ -34,7 +38,12 @@ static void test_midi_dac_plays_note(UNUSED void** state)
expect_value(__wrap_SND_PCM_startPlay, pan, SOUND_PAN_CENTER);
expect_value(__wrap_SND_PCM_startPlay, loop, 0);

__real_midi_note_on(5, 100, 100);
__real_midi_note_on(dacFmChannel, noteKey, 100);
}

static void test_midi_dac_does_not_play_null_sample(UNUSED void** state)
{
__real_midi_note_on(dacFmChannel, nullNoteKey, 100);
}

static void test_midi_dac_stops_note(UNUSED void** state)
Expand All @@ -45,9 +54,9 @@ static void test_midi_dac_stops_note(UNUSED void** state)
expect_value(__wrap_SND_PCM_startPlay, pan, SOUND_PAN_CENTER);
expect_value(__wrap_SND_PCM_startPlay, loop, 0);

__real_midi_note_on(5, 100, 100);
__real_midi_note_on(dacFmChannel, noteKey, 100);

expect_function_call(__wrap_SND_PCM_stopPlay);

__real_midi_note_off(5, 100);
__real_midi_note_off(dacFmChannel, noteKey);
}

0 comments on commit 8d2fb7b

Please sign in to comment.