This commit is contained in:
2025-12-29 15:49:51 -06:00
parent fb370b08eb
commit c0c914b40d
3 changed files with 18 additions and 12 deletions

View File

@@ -1,15 +1,17 @@
#include "MidiController.h" #include "MidiController.h"
#include <iostream> #include <iostream>
#include <chrono>
MidiController::MidiController(NoteQueue& queue) : noteQueue_(queue) { MidiController::MidiController(NoteQueue& queue) : noteQueue_(queue) {
try { try {
midiIn_ = std::make_unique<RtMidiIn>(); midiIn_ = std::make_unique<RtMidiIn>();
midiIn_->ignoreTypes(false, true, false); midiIn_->ignoreTypes(true, true, true);
} catch (RtMidiError& e) { } catch (RtMidiError& e) {
std::cerr << "RtMidi init failed: " << e.getMessage() << std::endl; std::cerr << "RtMidi init failed: " << e.getMessage() << std::endl;
} }
// TODO: this still doesnt work on windows
} }
MidiController::~MidiController() { MidiController::~MidiController() {
@@ -54,6 +56,10 @@ void MidiController::midiCallback(double /*deltaTime*/, std::vector<unsigned cha
void MidiController::handleMessage(const std::vector<unsigned char>& msg) { void MidiController::handleMessage(const std::vector<unsigned char>& msg) {
unsigned char status = msg[0] & 0xF0; unsigned char status = msg[0] & 0xF0;
if (status == 0xFE) return;
if (status == 0xF8) return;
unsigned char note = msg.size() > 1 ? msg[1] : 0; unsigned char note = msg.size() > 1 ? msg[1] : 0;
unsigned char vel = msg.size() > 2 ? msg[2] : 0; unsigned char vel = msg.size() > 2 ? msg[2] : 0;

View File

@@ -64,23 +64,23 @@ struct ParamDefault {
// later TODO: and then when I have full on profile saving there will be a default profile to load from // later TODO: and then when I have full on profile saving there will be a default profile to load from
constexpr std::array<ParamDefault, static_cast<size_t>(ParamId::Count)> PARAM_DEFS {{ constexpr std::array<ParamDefault, static_cast<size_t>(ParamId::Count)> PARAM_DEFS {{
{ 100.0f, 20.0f, 600.0f}, // Osc1Freq { 100.0f, 20.0f, 600.0f}, // Osc1Freq
{ 0.0f, 0.0f, 0.0f}, // Osc1WaveSelector1 { 2.0f, 0.0f, 0.0f}, // Osc1WaveSelector1
{ 1.0f, 0.0f, 0.0f}, // Osc1WaveSelector2 { 1.0f, 0.0f, 0.0f}, // Osc1WaveSelector2
{ 1.0f, 0.0f, 2.0f}, // Osc1VolumeDepth { 1.0f, 0.0f, 2.0f}, // Osc1VolumeDepth
{ 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA { 0.05f, 0.0f, 2.0f}, // Osc1VolumeEnvA
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD { 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvD
{ 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS { 0.7f, 0.0f, 1.0f}, // Osc1VolumeEnvS
{ 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR { 0.2f, 0.0f, 2.0f}, // Osc1VolumeEnvR
{ 1.0f, 0.0f, 8.0f}, // FilterCutoffDepth { 4.0f, 0.0f, 8.0f}, // FilterCutoffDepth
{ 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvA { 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvA
{ 0.05f, 0.0f, 2.0f}, // FilterCutoffEnvD { 0.20f, 0.0f, 2.0f}, // FilterCutoffEnvD
{ 2.0f, 0.0f, 1.0f}, // FilterCutoffEnvS { 0.2f, 0.0f, 1.0f}, // FilterCutoffEnvS
{ 0.08f, 0.0f, 2.0f}, // FilterCutoffEnvR { 0.25f, 0.0f, 2.0f}, // FilterCutoffEnvR
{ 1.414f, 0.0f, 8.0f}, // FilterResonanceDepth { 3.0f, 0.0f, 8.0f}, // FilterResonanceDepth
{ 0.05f, 0.0f, 2.0f}, // FilterResonanceEnvA { 0.05f, 0.0f, 2.0f}, // FilterResonanceEnvA
{ 0.05f, 0.0f, 2.0f}, // FilterResonanceEnvD { 0.20f, 0.0f, 2.0f}, // FilterResonanceEnvD
{ 0.5f, 0.0f, 1.0f}, // FilterResonanceEnvS { 0.5f, 0.0f, 1.0f}, // FilterResonanceEnvS
{ 0.10f, 0.0f, 2.0f}, // FilterResonanceEnvR { 0.30f, 0.0f, 2.0f}, // FilterResonanceEnvR
}}; }};
constexpr size_t PARAM_COUNT = static_cast<size_t>(ParamId::Count); constexpr size_t PARAM_COUNT = static_cast<size_t>(ParamId::Count);

View File

@@ -9,7 +9,7 @@
#endif #endif
// TODO: you get it, also in a yml config // TODO: you get it, also in a yml config
#define SYNTH_PITCH_STANDARD 432.0f // frequency of home pitch #define SYNTH_PITCH_STANDARD 440.0f // frequency of home pitch
#define SYNTH_MIDI_HOME 69 // midi note index of home pitch #define SYNTH_MIDI_HOME 69 // midi note index of home pitch
#define SYNTH_NOTES_PER_OCTAVE 12 #define SYNTH_NOTES_PER_OCTAVE 12
@@ -104,7 +104,7 @@ void Synth::process(float* out, uint32_t nFrames, uint32_t sampleRate) {
} }
// TODO: make pitchOffset variable for each oscillator (maybe three values like octave, semitone offset, and pitch offset in cents) // TODO: make pitchOffset variable for each oscillator (maybe three values like octave, semitone offset, and pitch offset in cents)
float pitchOffset = 0.5f; float pitchOffset = 1.0f;
float phaseInc = pitchOffset * 2.0f * M_PI * frequency_ / static_cast<float>(sampleRate); float phaseInc = pitchOffset * 2.0f * M_PI * frequency_ / static_cast<float>(sampleRate);
float gain = gainEnv * getParam(ParamId::Osc1VolumeDepth); float gain = gainEnv * getParam(ParamId::Osc1VolumeDepth);