Browse Source

Array of track instruments to make them addressable

main
heck 7 months ago
parent
commit
2b39777c28
  1. 74
      src/main_perkons.cc

74
src/main_perkons.cc

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

Loading…
Cancel
Save