summaryrefslogtreecommitdiffstats
path: root/arduino-monosynth.ino
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2016-03-14 22:49:19 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2016-03-14 22:49:19 +0200
commitf4abcb2f16855ec7717e8970e17605e7f3d7ce2b (patch)
tree252cb0c014b435f4d754e4d9d403c38e157b92de /arduino-monosynth.ino
parentb791625011d2f1c6fa604a3ff67d7479fcffa7de (diff)
Add 2 slave oscillators
Diffstat (limited to 'arduino-monosynth.ino')
-rw-r--r--arduino-monosynth.ino28
1 files changed, 22 insertions, 6 deletions
diff --git a/arduino-monosynth.ino b/arduino-monosynth.ino
index f399fb5..87f99a2 100644
--- a/arduino-monosynth.ino
+++ b/arduino-monosynth.ino
@@ -35,7 +35,10 @@
// Mozzi example uses COS waves for carrier and modulator
// Shit gets brutal very fast if you use a saw/square carrier
// Shit gets subtly more brutal if you use smaller wavetables (fewer samples per cycle)
-Oscil<SAW_ANALOGUE512_NUM_CELLS, AUDIO_RATE> oscCarrier(SAW_ANALOGUE512_DATA);
+Oscil<SAW_ANALOGUE512_NUM_CELLS, AUDIO_RATE> oscCarrierMaster(SAW_ANALOGUE512_DATA);
+Oscil<SAW_ANALOGUE512_NUM_CELLS, AUDIO_RATE> oscCarrierSlave1(SAW_ANALOGUE512_DATA);
+Oscil<SAW_ANALOGUE512_NUM_CELLS, AUDIO_RATE> oscCarrierSlave2(SAW_ANALOGUE512_DATA);
+
Oscil<COS2048_NUM_CELLS, AUDIO_RATE> oscModulator(COS2048_DATA);
Oscil<COS2048_NUM_CELLS, AUDIO_RATE> oscLFO(COS2048_DATA);
@@ -50,12 +53,15 @@ MIDI_CREATE_DEFAULT_INSTANCE();
unsigned long vibrato = 0;
float carrierFreq = 10.f;
float modFreq = 10.f;
-float modDepth = 0;
+float modDepth = 0.5;
float amplitude = 0.f;
float modOffset = 1;
byte lastnote = 0;
int portSpeed = 100;
+float detuneCoefficient1 = 1;
+float detuneCoefficient2 = 1;
+
float modOffsets[] = {
4, 3.5, 3, 2.5,
2, 1.5, 1, 0.6666667,
@@ -77,7 +83,7 @@ void setup()
MIDI.setHandleContinue(HandleContinue);
envelope.setADLevels(255, 174);
- envelope.setTimes(10, 50, 20000, 200); // 20000 is so the note will sustain 20 seconds unless a noteOff comes
+ envelope.setTimes(10, 50, 50, 1000); // 20000 is so the note will sustain 20 seconds unless a noteOff comes
aPortamento.setTime(50u);
oscLFO.setFreq(10); // default frequency
@@ -150,8 +156,17 @@ void updateControl()
MIDI.read();
envelope.update();
carrierFreq = Q16n16_to_float (aPortamento.next()); //NB presumably returns frequency as Q16n16
- modFreq = carrierFreq * modOffset;
- oscCarrier.setFreq(carrierFreq);
+ modFreq = carrierFreq * modOffset;
+
+ const unsigned short cents = 40;
+ detuneCoefficient1 = 1 + 0.0005946 * cents;
+ detuneCoefficient2 = 1 - 0.0005946 * cents;
+
+ // set carrier frequencies
+ oscCarrierMaster.setFreq(carrierFreq);
+ oscCarrierSlave1.setFreq(carrierFreq * detuneCoefficient1);
+ oscCarrierSlave2.setFreq(carrierFreq * detuneCoefficient2);
+
oscModulator.setFreq(modFreq);
}
@@ -159,7 +174,8 @@ int updateAudio()
{
vibrato = (unsigned long) (oscLFO.next() * oscModulator.next()) >> 7;
vibrato *= (unsigned long) (carrierFreq * modDepth) >> 3;
- return (int) ((oscCarrier.phMod(vibrato)) * (envelope.next())) >> 7;
+ int carrierSum = (oscCarrierMaster.phMod(vibrato) + oscCarrierSlave1.phMod(vibrato) + oscCarrierSlave2.phMod(vibrato)) >> 3;
+ return (int) (carrierSum * (envelope.next())) >> 8;
}
void loop()