From 6a3ad57f1f615ef7bbb10d2b60eadaa563b33a8c Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Tue, 18 Jan 2022 11:58:32 +0100 Subject: [PATCH] Started to add portamento code. --- src/Makefile | 4 +++- src/dexed.cpp | 2 ++ src/porta.cpp | 35 +++++++++++++++++++++++++++++++++++ src/porta.h | 28 ++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/porta.cpp create mode 100644 src/porta.h diff --git a/src/Makefile b/src/Makefile index c6da4ac..0e96de3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,7 +7,7 @@ DEBUG=1 INSTALL_DIR=/zynthian/zynthian-plugins/lv2 INSTALL_MYPLUGINS_DIR=/zynthian/zynthian-my-data/presets/lv2 -OBJ=fm_core.o env.o lfo.o dx7note.o sin.o pitchenv.o fm_op_kernel.o freqlut.o exp2.o EngineMkI.o EngineOpl.o PluginFx.o trace.o +OBJ=fm_core.o env.o lfo.o dx7note.o sin.o pitchenv.o fm_op_kernel.o freqlut.o exp2.o EngineMkI.o EngineOpl.o PluginFx.o trace.o porta.o CXXFLAGS_LVTK=$(shell pkg-config --cflags lvtk-plugin-2) CXXFLAGS+=-fPIC -DPIC -std=c++11 -I. $(CXXFLAGS_LVTK) -DLVTK_DEBUG=false @@ -130,5 +130,7 @@ EngineOpl.o: Makefile EngineOpl.cpp PluginFx.o: Makefile PluginFx.cpp $(CXX) $(CXXFLAGS) -Wall -c PluginFx.cpp +porta.o: Makefile porta.cpp + $(CXX) $(CXXFLAGS) -Wall -c porta.cpp dexed_ttl.h: Dexed.ttl ttl2c Dexed.ttl dexed_ttl.h diff --git a/src/dexed.cpp b/src/dexed.cpp index 1164b1b..f9af126 100644 --- a/src/dexed.cpp +++ b/src/dexed.cpp @@ -30,6 +30,7 @@ #include "PluginFx.h" #include #include +#include "porta.h" Dexed::Dexed(double rate) : lvtk::Synth(p_n_ports, p_midi_in) { @@ -46,6 +47,7 @@ Dexed::Dexed(double rate) : lvtk::Synth(p_n_ports, p_midi_in) Lfo::init(rate); PitchEnv::init(rate); Env::init_sr(rate); + Porta::init_sr(rate); fx.init(rate); engineMkI=new EngineMkI; diff --git a/src/porta.cpp b/src/porta.cpp new file mode 100644 index 0000000..f32b22a --- /dev/null +++ b/src/porta.cpp @@ -0,0 +1,35 @@ +/* + Copyright 2019 Jean Pierre Cimalando. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include +#include "porta.h" +#include "msfa/synth.h" + +void Porta::init_sr(double sampleRate) +{ + // compute portamento for CC 7-bit range + + for (unsigned int i = 0; i < 128; ++i) { + // number of semitones travelled + double sps = 350.0 * pow(2.0, -0.062 * i); // per second + double spf = sps / sampleRate; // per frame + double spp = spf * N; // per period + const int step = (1 << 24) / 12; + rates[i] = (int32_t)(0.5f + step * spp); // to pitch units + } +} + +int32_t Porta::rates[128]; diff --git a/src/porta.h b/src/porta.h new file mode 100644 index 0000000..d8a6b8c --- /dev/null +++ b/src/porta.h @@ -0,0 +1,28 @@ +/* + Copyright 2019 Jean Pierre Cimalando. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef SYNTH_PORTA_H_ +#define SYNTH_PORTA_H_ + +#include + +struct Porta { + public: + static void init_sr(double sampleRate); + static int32_t rates[128]; +}; + +#endif // SYNTH_PORTA_H_