Berghain Box
Fabrication
Text and long form content.
Code
#include <MozziGuts.h>
#include <IntMap.h>
#include <Oscil.h>
#include <Metronome.h>
#include <Sample.h>
#include <RollingAverage.h>
#include <DCfilter.h>
#include <ArduinoTapTempo.h>
#include <Ead.h>
#include <tables/sin2048_int8.h>
#include <tables/saw2048_int8.h>
#include <samples/bkick.h>
#define CONTROL_RATE 128
ArduinoTapTempo tapTempo;
Metronome kMetro(600);
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> aSaw(SAW2048_DATA);
Ead envelope(CONTROL_RATE);
Sample <bkick_NUM_CELLS, AUDIO_RATE>aSample(bkick_DATA);
RollingAverage <int, 8> avgA;
DCfilter dcB(0.9);
RollingAverage <int, 8> avgC;
RollingAverage <int, 8> avgD;
DCfilter dcBTN(0.9);
const IntMap fMap(0,1023,30,300);
const IntMap decayMap(0,1023,100,2000);
const IntMap bpm(0,1023,10,400);
int knobVal, rate, knFreq, knobA, knobB, knobC, knobD, envGain;
bool buttonPress, kMetrun, tapActive;
void setup() {
startMozzi(CONTROL_RATE);
Serial.begin(115200);
aSin.setFreq(75);
aSaw.setFreq(75);
pinMode(7, INPUT_PULLUP);
kMetro.setBPM(120);
kMetro.start();
aSample.setFreq(15.66328f);
}
void updateControl(){
readControls();
if (kMetro.ready()) {
aSample.start();
unsigned int decayVal = decayMap(knobC);
unsigned int attackVal = 20;
envelope.start(attackVal,decayVal);
}
envGain = (int) envelope.next();
tapTempo.update(buttonPress);
float pitch = (knobA / 1024.0) * 10.3333f;
aSample.setFreq(pitch);
int waveFreq = fMap(knobA);
aSin.setFreq(waveFreq);
aSaw.setFreq(waveFreq);
if (tapActive) {
rate = tapTempo.getBPM();
} else {
rate = bpm(knobB);
}
kMetro.setBPM(rate);
Serial.print(" A: ");Serial.print(knobA);
Serial.print(" B: ");Serial.print(knobB);
Serial.print(" C: ");Serial.print(knobC);
Serial.print(" D: ");Serial.print(knobD);
Serial.print(" Btn: ");Serial.print(buttonPress);
Serial.print(" freq: ");Serial.print(pitch);
Serial.print(" bpm: ");Serial.print(tapTempo.getBPM());
Serial.print("\n");
}
AudioOutput_t updateAudio(){
//int asig = (int) aSample.next();
if (knobD > 512) {
int asig = (int) aSample.next();
return MonoOutput::from8Bit(asig);
} else {
int apig = (int) aSin.next();
return MonoOutput::from16Bit(apig*envGain);
}
//return MonoOutput::fromAlmostNBit(7, asig);
//return MonoOutput::fromAlmostNBit(5, asig).clip();
}
void loop() {
audioHook();
}
void readControls() {
int potA = mozziAnalogRead(A0);
knobA = 1023 - avgA.next(potA);
int potB = mozziAnalogRead(A1);
int senVal = dcB.next(potB);
if (senVal < -2 || senVal > 2) {
tapActive = LOW;
knobB = 1023 - potB;
}
int potC = mozziAnalogRead(A2);
knobC = 1023 - avgC.next(potC);
int potD = mozziAnalogRead(A3);
knobD = 1023 - avgD.next(potD);
bool butA = digitalRead(7);
buttonPress = butA == HIGH;
if (buttonPress) {
tapActive = HIGH;
}
}