This commit is contained in:
2026-06-14 12:48:42 -05:00
parent 397e1fe7dc
commit cfc8cb2b51
3 changed files with 51 additions and 5 deletions

35
scripts/string_model.py Normal file
View File

@@ -0,0 +1,35 @@
import scipy.signal as sig
import matplotlib.pyplot as plt
import numpy as np
# simple first order step response simulation
# www.halvorsen.blog/documents/programming/python/resources/powerpoints/State Space Models with Python.pdf
# simulation Parameters
x0 = [0, 0]
start = 0
stop = 30
step = 1
t = np.arange(start,stop,step)
K = 3
T = 4
# state-space Model
A = [[-1/T, 0], [0, 0]]
B = [[K/T], [0]]
C = [[1, 0]]
D = 0
sys = sig.StateSpace(A, B, C, D)
# step Response
t, y = sig.step(sys, x0, t)
# plotting
plt.plot(t, y)
plt.title("Step Response")
plt.xlabel("t")
plt.ylabel("y")
plt.grid()
plt.show()

View File

@@ -28,7 +28,7 @@ bool Instrument::isActive() {
float Instrument::process(bool& scopeTrigger) {
if(active_ && envelope_ < 1.0f) envelope_ += 0.01f;
if(!active_ && envelope_ > 0.0f) envelope_ -= 0.01f;
if(!active_ && envelope_ > 0.0f) envelope_ -= 0.0004f;
phase_ += phaseIncrement_;
if(phase_ > 2.0f * pi) {
@@ -37,6 +37,10 @@ float Instrument::process(bool& scopeTrigger) {
}
if(!isActive()) return 0.0f;
return sin(phase_) * envelope_;
// float sample = sin(phase_);
float sample = phase_ / pi - 1.0f; // saw
return sample * envelope_;
}

View File

@@ -10,12 +10,19 @@ Synth::Synth(ConfigService* config, LoggerService* logger, ScopeBuffer* scope, N
void Synth::handleNoteEvent(const NoteEvent& event) {
Voice* v = findVoiceByNote(event.note);
if(v != nullptr) v->noteOff();
// Voice* v = findVoiceByNote(event.note);
// if(v != nullptr) v->noteOff();
// stop all voices that are currently playing this note
for(Voice& v : voices_) {
if(v.isActive() && v.note() == event.note) {
v.noteOff();
}
}
if(event.type == NoteEventType::NoteOn) {
v = findFreeVoice();
Voice* v = findFreeVoice();
if(v != nullptr) v->noteOn(event.note, event.velocity);
}