diff --git a/src/main_perkons.cc b/src/main_perkons.cc index f1b63ba..af908dc 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -1,4 +1,7 @@ // Hecks perkons extension +#include +#include +#include #include "daisy_seed.h" #include "daisysp.h" @@ -7,6 +10,9 @@ #include "perkons_instrument_interface.hh" #include "instr_kick.hh" #include "instr_noise.hh" +#include "instr_fm.hh" + +#define TRACK_COUNT 4 using namespace daisy; using namespace daisysp; @@ -14,41 +20,54 @@ using namespace daisysp; static DaisySeed hw{}; static MidiUartHandler midi{}; static FIFO event_log{}; -static float samplerate{}; -static Heck::Instrument::Kick instr_kick{}; -static Heck::Instrument::Noise instr_noise{}; +Heck::Instrument::Noise instrument0{}; +Heck::Instrument::FM instrument1{}; +Heck::Instrument::FM instrument2{}; +Heck::Instrument::Kick instrument3{}; + +std::array, TRACK_COUNT> tracks{}; + void AudioCallback( AudioHandle::InterleavingInputBuffer in, AudioHandle::InterleavingOutputBuffer out, size_t size) { - float sig{}; - + float sig_out{}; for (size_t i = 0; i < size; i += 2) { - float kick_sig = instr_kick.nextsample(); - float noise_sig = instr_noise.nextsample(); - sig = .5 * noise_sig + .5 * kick_sig; - sig *= 0.4; + for (int i = 0; i < TRACK_COUNT; i++) { + sig_out += tracks[i]->nextsample(); + } - out[i] = sig; - out[i + 1] = sig; + sig_out *= 0.1; + out[i] = sig_out; + out[i + 1] = sig_out; } } -int init_dsp_chain() +int create_tracks(float samplerate) { - instr_kick.init(samplerate); - instr_noise.init(samplerate); + instrument0.init(samplerate); + tracks[0] = std::shared_ptr(&instrument0); + instrument1.init(samplerate); + tracks[1] = std::shared_ptr(&instrument1); + instrument2.init(samplerate); + tracks[2] = std::shared_ptr(&instrument2); + instrument3.init(samplerate); + tracks[3] = std::shared_ptr(&instrument3); + return 0; } int main(void) { + int* npt = nullptr; + int i = *npt; + hw.Configure(); hw.Init(); - hw.StartLog(); + hw.StartLog(true); uint32_t now = System::GetNow(); uint32_t log_time{}; @@ -58,12 +77,17 @@ int main(void) // Start Audio hw.SetAudioBlockSize(4); - samplerate = hw.AudioSampleRate(); + float samplerate = hw.AudioSampleRate(); + + hw.PrintLine("Creating Tracks"); + create_tracks(samplerate); + + hw.PrintLine("Starting Audio"); hw.StartAudio(AudioCallback); - init_dsp_chain(); // MIDI RX + hw.PrintLine("Setting up MIDI"); MidiUartHandler::Config midi_config; midi.Init(midi_config); uint32_t systick_last_rt_msg{}; @@ -85,27 +109,23 @@ int main(void) // hw.PrintLine("%s", outstr); }; + hw.PrintLine("Starting MIDI Receive"); midi.StartReceive(); midi.Listen(); + hw.PrintLine("Entering MainLoop"); while (1) { now = System::GetNow(); while (midi.HasEvents()) { MidiEvent msg = midi.PopEvent(); event_log.PushBack(msg); if (msg.type == MidiMessageType::NoteOn) { - if (msg.channel == 0) { - instr_kick.trigger(); + if (msg.channel >= 0 && msg.channel < TRACK_COUNT) { + tracks[msg.channel]->trigger(); } - if (msg.channel == 1) { - instr_noise.trigger(); - } - - std::array bytes = { 0x90, 0x00, 0x00 }; - bytes[1] = msg.data[0]; - bytes[2] = msg.data[1]; - midi.SendMessage(bytes.data(), 3); } else if (msg.type == MidiMessageType::ControlChange) { +// ControlChangeEvent cc = msg.AsControlChange(); + event_log.PushBack(msg); } else { } }