diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ce08f5..dee1fba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,11 @@ FetchContent_Declare( GIT_REPOSITORY https://github.com/hyperrealm/libconfig.git GIT_TAG v1.8.2 ) +FetchContent_Declare( + eigen + GIT_REPOSITORY git@gitlab.com:libeigen/eigen.git + GIT_TAG 5.0 +) FetchContent_MakeAvailable(rtaudio) FetchContent_MakeAvailable(rtmidi) FetchContent_MakeAvailable(libconfig) diff --git a/README.md b/README.md index 02fc744..f614f9d 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ to produce somewhat well-sounding instruments and music performance. to external midi controllers/apps (like musescore) - [ ] Create a UI scope to visualize the synthesized composite waveform - [ ] Check cross-platform combatibility for Windows & Linux, especially MIDI interfacing -- [ ] Checkpoint at a rudimentary keyboard instrument producing a basic sine output +- [x] Checkpoint at a rudimentary keyboard instrument producing a basic sine output - [ ] Will flesh out future goals when I do the math on how complicated implementing state-space modelling in c++ is diff --git a/src/synth/Instrument.cpp b/src/synth/Instrument.cpp index cd51a0c..09ba614 100644 --- a/src/synth/Instrument.cpp +++ b/src/synth/Instrument.cpp @@ -10,11 +10,10 @@ Instrument::Instrument(ConfigService* config, LoggerService* logger) : void Instrument::noteOn(float frequency, float velocity) { - // std::string msg = "NoteOn Frequency = " + std::to_string(frequency); - // if(logger_ != nullptr) logger_->log("Instrument", LogFlag::Debug, msg); - phaseIncrement_ = 2.0f * pi * frequency / sampleRate_; + envelope_ += 0.01f; // so it triggers as active + active_ = true; } @@ -23,14 +22,18 @@ void Instrument::noteOff() { } bool Instrument::isActive() { - return active_; + return (envelope_ > 0.0f); } float Instrument::process(bool& scopeTrigger) { + if(active_ && envelope_ < 1.0f) envelope_ += 0.01f; + if(!active_ && envelope_ > 0.0f) envelope_ -= 0.01f; + phase_ += phaseIncrement_; if(phase_ > 2.0f * pi) phase_ -= 2.0f * pi; - return sin(phase_); + if(!isActive()) return 0.0f; + return sin(phase_) * envelope_; } diff --git a/src/synth/Instrument.hpp b/src/synth/Instrument.hpp index fbb9118..7ccc6a7 100644 --- a/src/synth/Instrument.hpp +++ b/src/synth/Instrument.hpp @@ -32,5 +32,6 @@ private: static constexpr float pi = 3.14159265358979323846f; float phase_ = 0.0f; float phaseIncrement_ = 0.0f; + float envelope_ = 0.0f; }; diff --git a/src/synth/Synth.cpp b/src/synth/Synth.cpp index a5790df..154aa52 100644 --- a/src/synth/Synth.cpp +++ b/src/synth/Synth.cpp @@ -45,7 +45,7 @@ void Synth::process(float* out, size_t nFrames) { float mix = 0.0f; for(size_t j = 0; j < voices_.size(); j++) { bool temp = false; - if(!voices_[j].isActive()) continue; + //if(!voices_[j].isActive()) continue; mix += voices_[j].process(temp); // if(j == lowestVoice) triggered = temp; }