Upload files to 'Software'
This commit is contained in:
parent
566bacc562
commit
aa98204941
|
@ -0,0 +1,61 @@
|
|||
#ifndef _PANEL_SCANNER_H_
|
||||
#define _PANEL_SCANNER_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "editor.h"
|
||||
|
||||
static const uint32_t NUM_PANELS = 3;
|
||||
|
||||
class PanelScanner
|
||||
{
|
||||
public:
|
||||
PanelScanner();
|
||||
|
||||
void initScanning();
|
||||
|
||||
void tick();
|
||||
|
||||
void clearAllLED();
|
||||
|
||||
void setHalfLED(uint32_t num, bool on = true);
|
||||
void clearHalfLED(uint32_t num);
|
||||
void clearAllHalfLEDs();
|
||||
|
||||
void setBackgroundLED(uint32_t num, bool on = true);
|
||||
void clearBackgroundLED(uint32_t num);
|
||||
void clearAllBackgroundLEDs();
|
||||
|
||||
void setBlinkingLED(uint32_t num, bool on = true);
|
||||
void clearBlinkingLED(uint32_t num);
|
||||
void clearAllBlinkingLEDs();
|
||||
|
||||
void setOverlayLED(uint32_t num);
|
||||
void clearOverlayLED(uint32_t num);
|
||||
void clearAllOverlayLEDs();
|
||||
|
||||
void dumpLEDs();
|
||||
|
||||
|
||||
private:
|
||||
|
||||
// internal routines
|
||||
void readButtons();
|
||||
void parseButtons();
|
||||
|
||||
void doTransaction();
|
||||
|
||||
// internal data
|
||||
|
||||
uint8_t led_half_buffer[NUM_PANELS];
|
||||
uint8_t led_background_buffer[NUM_PANELS];
|
||||
uint8_t led_blinking_buffer[NUM_PANELS];
|
||||
uint8_t led_overlay_buffer[NUM_PANELS];
|
||||
uint8_t old_buttons[NUM_PANELS];
|
||||
uint8_t new_buttons[NUM_PANELS];
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // keepout
|
|
@ -0,0 +1,314 @@
|
|||
#include <Arduino.h>
|
||||
#include <Audio.h>
|
||||
#include <SPI.h>
|
||||
#include <SD.h>
|
||||
|
||||
#include "pattern.h"
|
||||
|
||||
static const uint32_t sequence[Pattern::PATTERN_LEN] =
|
||||
{
|
||||
#if 0
|
||||
//shaker and toms....
|
||||
//S123OCSK
|
||||
0b100001000001,
|
||||
0b00000000,
|
||||
0b10100000,
|
||||
0b10000000,
|
||||
0b00010001,
|
||||
0b00000000,
|
||||
0b10100000,
|
||||
0b10000000,
|
||||
0b01000001,
|
||||
0b01000000,
|
||||
0b10000000,
|
||||
0b10100000,
|
||||
0b00100001,
|
||||
0b00000000,
|
||||
0b10010000,
|
||||
0b10010000,
|
||||
#else
|
||||
//kick, snare & hats
|
||||
0b100000000101,
|
||||
0b00000100,
|
||||
0b10000100,
|
||||
0b10000101,
|
||||
0b00000110,
|
||||
0b00000100,
|
||||
0b10001001,
|
||||
0b10000010,
|
||||
0b00000101,
|
||||
0b00000100,
|
||||
0b10000100,
|
||||
0b10000100,
|
||||
0b00000110,
|
||||
0b00000100,
|
||||
0b10010100,
|
||||
0b10000100,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const uint8_t SD_CHIPSEL = 10;
|
||||
|
||||
|
||||
// constructor...
|
||||
Pattern::Pattern()
|
||||
{
|
||||
|
||||
// Only init internal data -
|
||||
// adding dependencies on other items at this point is tricky, if we aren't really careful
|
||||
// about order of construction.
|
||||
|
||||
for (uint32_t i = 0; i < PATTERN_LEN; i++)
|
||||
{
|
||||
for (uint32_t j = 0; j < NUM_PATTERNS; j++)
|
||||
{
|
||||
pattern_data[j][i] = sequence[i];
|
||||
}
|
||||
}
|
||||
|
||||
setCurrentVoice(0);
|
||||
setCurrentPattern(0);
|
||||
|
||||
current_voice_mask = 0x01;
|
||||
current_accent_mask = 0x010000;
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool Pattern::toggleBit(uint32_t index)
|
||||
{
|
||||
if (index >= PATTERN_LEN)
|
||||
{
|
||||
Serial.println("Overflow in toggle");
|
||||
index %= PATTERN_LEN;
|
||||
}
|
||||
|
||||
pattern_data[current_pattern][index] ^= current_voice_mask;
|
||||
|
||||
return (pattern_data[current_pattern][index] & current_voice_mask);
|
||||
}
|
||||
|
||||
|
||||
bool Pattern::toggleAccentBit(uint32_t index)
|
||||
{
|
||||
if (index >= PATTERN_LEN)
|
||||
{
|
||||
Serial.println("Overflow in toggle");
|
||||
index %= PATTERN_LEN;
|
||||
}
|
||||
|
||||
pattern_data[current_pattern][index] ^= current_accent_mask;
|
||||
|
||||
return (pattern_data[current_pattern][index] & current_accent_mask);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Return all of the buts for the current step
|
||||
uint32_t Pattern::getStepData(uint32_t index)
|
||||
{
|
||||
if (index >= PATTERN_LEN)
|
||||
{
|
||||
Serial.println("Overflow in pattern req");
|
||||
index %= PATTERN_LEN;
|
||||
}
|
||||
|
||||
return pattern_data[current_pattern][index];
|
||||
}
|
||||
|
||||
// Get all of the column data for a particular voice
|
||||
bool Pattern::getVoiceBit(uint32_t step)
|
||||
{
|
||||
if (step >= PATTERN_LEN)
|
||||
{
|
||||
Serial.println("Overflow in pattern bit");
|
||||
step %= PATTERN_LEN;
|
||||
}
|
||||
#if 0
|
||||
Serial.print("GVB: curr ") ;
|
||||
Serial.print(current_pattern) ;
|
||||
Serial.print(" step ") ;
|
||||
Serial.println(step) ;
|
||||
#endif
|
||||
|
||||
return (pattern_data[current_pattern][step] & current_voice_mask);
|
||||
}
|
||||
|
||||
bool Pattern::getAccentBit(uint32_t step)
|
||||
{
|
||||
if (step >= PATTERN_LEN)
|
||||
{
|
||||
Serial.println("Overflow in pattern bit");
|
||||
step %= PATTERN_LEN;
|
||||
}
|
||||
|
||||
return (pattern_data[current_pattern][step] & current_accent_mask);
|
||||
}
|
||||
|
||||
|
||||
void Pattern::setCurrentVoice(uint32_t num)
|
||||
{
|
||||
current_voice = num;
|
||||
current_voice_mask = 1 << num;
|
||||
current_accent_mask = 1 << (num + 16);
|
||||
}
|
||||
|
||||
uint32_t Pattern::getCurrentVoice(void)
|
||||
{
|
||||
return current_voice;
|
||||
}
|
||||
|
||||
void Pattern::setCurrentPattern(uint32_t nextpatt)
|
||||
{
|
||||
if (nextpatt < NUM_PATTERNS)
|
||||
{
|
||||
current_pattern = nextpatt;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t Pattern::getCurrentPattern()
|
||||
{
|
||||
return current_pattern;
|
||||
}
|
||||
|
||||
void Pattern::clearCurrentPattern()
|
||||
{
|
||||
for (uint32_t i = 0; i < PATTERN_LEN; i++)
|
||||
{
|
||||
pattern_data[current_pattern][i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Pattern::randomizeCurrentPattern()
|
||||
{
|
||||
for (uint32_t i = 0; i < PATTERN_LEN; i++)
|
||||
{
|
||||
pattern_data[current_pattern][i] = random(0x0fff) & random(0x0fff) ;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
////////// file management
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool Pattern::writeToCard()
|
||||
{
|
||||
File fd;
|
||||
size_t len;
|
||||
bool success = false;
|
||||
|
||||
// shouldn't reach here if playing.
|
||||
|
||||
Serial.println("***** Attempting pattern file write");
|
||||
|
||||
if (SD.exists("test.txt"))
|
||||
{
|
||||
Serial.println("** found test file!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("** NO test file!");
|
||||
}
|
||||
|
||||
|
||||
fd = SD.open("patt.txt", FILE_WRITE);
|
||||
|
||||
if (!fd)
|
||||
{
|
||||
Serial.println("** no fd!");
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
fd.seek(0);
|
||||
|
||||
len = sizeof(pattern_data);
|
||||
Serial.print("Pattern memoty total length: ");
|
||||
Serial.println(len);
|
||||
|
||||
if (fd.write((uint8_t*)pattern_data, len) != len)
|
||||
{
|
||||
Serial.println("** Bad write length");
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
success = true;
|
||||
Serial.println("***** Pattern file completely written.");
|
||||
|
||||
CLEANUP:
|
||||
|
||||
if (fd)
|
||||
{
|
||||
Serial.println("Cleaning up fd");
|
||||
fd.flush();
|
||||
fd.close();
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
bool Pattern::readFromCard()
|
||||
{
|
||||
File fd;
|
||||
size_t len, avail;
|
||||
bool success = false;
|
||||
|
||||
uint8_t val;
|
||||
uint8_t* munge = (uint8_t*)pattern_data;
|
||||
|
||||
|
||||
Serial.println("***** Attempting pattern file read");
|
||||
|
||||
if (!SD.exists("patt.txt"))
|
||||
{
|
||||
Serial.println("** NO pattern file!");
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
Serial.println("** found pattern file!");
|
||||
|
||||
fd = SD.open("patt.txt", FILE_READ);
|
||||
|
||||
if (!fd)
|
||||
{
|
||||
Serial.println("** no fd!");
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
fd.seek(0);
|
||||
|
||||
len = sizeof(pattern_data);
|
||||
Serial.print("Pattern memoty total length: ");
|
||||
Serial.println(len);
|
||||
|
||||
avail = fd.available();
|
||||
Serial.print("File has bytes: ");
|
||||
Serial.println(avail);
|
||||
|
||||
if (len != avail)
|
||||
{
|
||||
Serial.println("File Read error: length/struct mismatch");
|
||||
goto CLEANUP;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < len; i++)
|
||||
{
|
||||
val = fd.read();
|
||||
munge[i] = val;
|
||||
}
|
||||
|
||||
success = true;
|
||||
|
||||
Serial.println("***** Pattern file completely read.");
|
||||
|
||||
CLEANUP:
|
||||
|
||||
if (fd)
|
||||
{
|
||||
Serial.println("Cleaning up fd");
|
||||
fd.flush();
|
||||
fd.close();
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
#ifndef _PATTERN_H_
|
||||
#define _PATTERN_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
||||
class Pattern
|
||||
{
|
||||
public:
|
||||
static const uint32_t PATTERN_LEN = 16;
|
||||
static const uint32_t NUM_PATTERNS = 16;
|
||||
|
||||
Pattern();
|
||||
|
||||
bool toggleBit(uint32_t step);
|
||||
bool toggleAccentBit(uint32_t step);
|
||||
|
||||
void setCurrentVoice(uint32_t);
|
||||
uint32_t getCurrentVoice(void);
|
||||
|
||||
void setCurrentPattern(uint32_t);
|
||||
uint32_t getCurrentPattern();
|
||||
|
||||
void clearCurrentPattern();
|
||||
void randomizeCurrentPattern();
|
||||
|
||||
uint32_t getStepData(uint32_t index);
|
||||
bool getVoiceBit(uint32_t step);
|
||||
bool getAccentBit(uint32_t step);
|
||||
|
||||
bool writeToCard();
|
||||
bool readFromCard();
|
||||
|
||||
private:
|
||||
|
||||
uint32_t pattern_data[NUM_PATTERNS][PATTERN_LEN];
|
||||
|
||||
uint32_t current_pattern;
|
||||
uint32_t current_voice;
|
||||
uint32_t current_voice_mask;
|
||||
uint32_t current_accent_mask;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // keepout
|
|
@ -0,0 +1,439 @@
|
|||
#include "voice.h"
|
||||
|
||||
#include <TeensyBoomVoiceLibrary.h>
|
||||
|
||||
//#include "Synth-Clatter.h"
|
||||
//#include "Synth-Decay.h"
|
||||
//#include "Synth-DrumHeart.h"
|
||||
//#include "synth_simple_drum.h"
|
||||
|
||||
#include "player.h" // required so we can update tempo param from knob update func.
|
||||
|
||||
extern Player thePlayer;
|
||||
|
||||
#define HAT
|
||||
#define KICK
|
||||
#define SNARE
|
||||
#define TOM
|
||||
#define SHAKER
|
||||
#define BELL
|
||||
#define CYMBAL
|
||||
#define CLAP
|
||||
|
||||
// Used by multiple instruments:
|
||||
AudioSynthNoiseWhite noise;
|
||||
|
||||
#ifdef HAT
|
||||
// hats
|
||||
AudioSynthClatter clat1;
|
||||
AudioSynthDecay hatdecay;
|
||||
AudioFilterBiquad hatfilter;
|
||||
AudioEffectMultiply hatmult;
|
||||
#endif
|
||||
|
||||
#ifdef BELL
|
||||
AudioSynthDecay belldecay;
|
||||
AudioEffectMultiply bellmult;
|
||||
#endif
|
||||
|
||||
#ifdef KICK
|
||||
// kick
|
||||
AudioSynthSimpleDrum kick;
|
||||
#endif
|
||||
|
||||
#ifdef SNARE
|
||||
// snare
|
||||
AudioSynthDrumHeart snare;
|
||||
AudioMixer4 snaremix;
|
||||
AudioEffectMultiply snaremult;
|
||||
#endif
|
||||
|
||||
#ifdef TOM
|
||||
// tom
|
||||
AudioSynthSimpleDrum tom;
|
||||
#endif
|
||||
|
||||
#ifdef SHAKER
|
||||
// shaker
|
||||
AudioSynthDecay shakedecay;
|
||||
AudioFilterBiquad shakefilter;
|
||||
AudioEffectMultiply shakemult;
|
||||
#endif
|
||||
|
||||
#ifdef CYMBAL
|
||||
AudioSynthDecay cymbaldecay;
|
||||
AudioFilterBiquad cymbalfilter;
|
||||
AudioEffectMultiply cymbalmult;
|
||||
#endif
|
||||
|
||||
#ifdef CLAP
|
||||
AudioSynthDecay clapdecay;
|
||||
AudioEffectMultiply clapmult;
|
||||
AudioFilterBiquad clapfilter;
|
||||
AudioEffectClapEnvelope clapenv;
|
||||
#endif
|
||||
|
||||
// outputs
|
||||
AudioMixer4 mixer1;
|
||||
AudioMixer4 mixer2;
|
||||
AudioMixer4 mixer3;
|
||||
|
||||
// Master volume control between mixers and output,
|
||||
// because the output level controls are independent between
|
||||
// phones and line outputs.
|
||||
AudioEffectMultiply mastervol;
|
||||
AudioSynthWaveformDc volcontrol;
|
||||
|
||||
AudioOutputI2S i2s1; //xy=968,448
|
||||
|
||||
#ifdef HAT
|
||||
AudioConnection patchCord01(clat1, 0, hatfilter, 0);
|
||||
AudioConnection patchCord02(hatfilter, 0, hatmult, 0);
|
||||
//AudioConnection patchCord03(hatfilter, 0, hatmult, 0);
|
||||
//AudioConnection patchCord01(hatdecay, 0, hatmult, 0);
|
||||
AudioConnection patchCord03(hatdecay, 0, hatmult, 1);
|
||||
AudioConnection patchCord90(hatmult, 0, mixer1, 0);
|
||||
#endif
|
||||
|
||||
#ifdef BELL
|
||||
AudioConnection patchCord04(clat1, 1, bellmult, 0);
|
||||
AudioConnection patchCord05(belldecay, 0, bellmult, 1);
|
||||
AudioConnection patchCord96(bellmult, 0, mixer2, 2);
|
||||
#endif
|
||||
|
||||
#ifdef KICK
|
||||
AudioConnection patchCord10(kick, 0, mixer1, 1);
|
||||
#endif
|
||||
|
||||
#ifdef SNARE
|
||||
AudioConnection patchCord20(noise, 0, snaremix, 0);
|
||||
AudioConnection patchCord21(snare, 0, snaremix, 1);
|
||||
AudioConnection patchCord22(snare, 1, snaremult, 1);
|
||||
AudioConnection patchCord23(snaremix, 0, snaremult, 0);
|
||||
AudioConnection patchCord92(snaremult, 0, mixer1, 2);
|
||||
#endif
|
||||
|
||||
#ifdef TOM
|
||||
AudioConnection patchCord30(tom, 0, mixer2, 0);
|
||||
#endif
|
||||
|
||||
#ifdef SHAKER
|
||||
AudioConnection patchCord40(noise, 0, shakefilter, 0);
|
||||
AudioConnection patchCord41(shakefilter, 0, shakemult, 0);
|
||||
AudioConnection patchCord42(shakedecay, 0, shakemult, 1);
|
||||
AudioConnection patchCord95(shakemult, 0, mixer2, 1);
|
||||
#endif
|
||||
|
||||
#ifdef CYMBAL
|
||||
AudioConnection patchCord50(clat1, 0, cymbalfilter, 0);
|
||||
AudioConnection patchCord51(cymbalfilter, cymbalmult);
|
||||
AudioConnection patchCord52(cymbaldecay, 0, cymbalmult, 1);
|
||||
AudioConnection patchCord97(cymbalmult, 0, mixer3, 2);
|
||||
#endif
|
||||
|
||||
#ifdef CLAP
|
||||
AudioConnection patchCord60(noise, 0, clapenv, 0);
|
||||
AudioConnection patchCord61(clapenv, 0, mixer3, 0);
|
||||
AudioConnection patchCord62(noise, 0, clapfilter, 0);
|
||||
AudioConnection patchCord63(clapfilter, 0, clapmult, 0);
|
||||
AudioConnection patchCord64(clapdecay, 0, clapmult, 1);
|
||||
AudioConnection patchCord65(clapmult, 0, mixer3, 1);
|
||||
#endif
|
||||
|
||||
AudioConnection patchCord93(mixer2, 0, mixer1, 3);
|
||||
AudioConnection patchCord967(mixer3, 0, mixer2, 3);
|
||||
|
||||
AudioConnection patchCord965(mixer1, 0, mastervol, 0);
|
||||
AudioConnection patchCord966(volcontrol, 0 , mastervol, 1);
|
||||
|
||||
AudioConnection patchCord98(mastervol, 0, i2s1, 0);
|
||||
AudioConnection patchCord99(mastervol, 0, i2s1, 1);
|
||||
|
||||
AudioControlSGTL5000 sgtl5000_1;
|
||||
|
||||
|
||||
|
||||
|
||||
// Globals for params on shared voices
|
||||
uint16_t openlen, closedlen;
|
||||
uint16_t t1, t2, t3;
|
||||
|
||||
void voiceInit()
|
||||
{
|
||||
AudioNoInterrupts();
|
||||
|
||||
sgtl5000_1.enable();
|
||||
sgtl5000_1.volume(0.7);
|
||||
sgtl5000_1.lineOutLevel(13);
|
||||
|
||||
paramInit();
|
||||
|
||||
AudioInterrupts();
|
||||
|
||||
}
|
||||
|
||||
void paramInit()
|
||||
{
|
||||
// common to severl instruments
|
||||
noise.amplitude(0.5);
|
||||
|
||||
#ifdef HAT
|
||||
// hat stuff
|
||||
//clat1; - no params
|
||||
//hatdecay.length(150);
|
||||
openlen = 300;
|
||||
closedlen = 50;
|
||||
hatfilter.setHighpass(0, 700, 0.2);
|
||||
hatfilter.setLowpass(1, 10000, 0.8);
|
||||
|
||||
//hatdecay.frequency(1500);
|
||||
//hatdecay.length(50);
|
||||
#endif
|
||||
|
||||
#ifdef BELL
|
||||
belldecay.length(333);
|
||||
#endif
|
||||
|
||||
#ifdef KICK
|
||||
// kick
|
||||
kick.frequency(60);
|
||||
kick.length(100);
|
||||
kick.pitchMod(0x2f0); // 0x200 is no mod...
|
||||
#endif
|
||||
|
||||
#ifdef SNARE
|
||||
// snare
|
||||
snare.frequency(200);
|
||||
snare.length(100);
|
||||
snare.second(true);
|
||||
snare.pitchMod(0x280);
|
||||
snaremix.gain(0, 0.75);
|
||||
snaremix.gain(1, 0.5);
|
||||
#endif
|
||||
|
||||
#ifdef TOM
|
||||
// tom
|
||||
//tom.frequency(80);
|
||||
t1 = 60;
|
||||
tom.secondMix(1.0);
|
||||
tom.length(250);
|
||||
tom.pitchMod(0.75);
|
||||
#endif
|
||||
|
||||
#ifdef SHAKER
|
||||
// shaker
|
||||
shakefilter.setLowpass(0, 3500, 0.7);
|
||||
shakefilter.setHighpass(1, 400, 0.3);
|
||||
shakedecay.length(50);
|
||||
#endif
|
||||
|
||||
#ifdef CYMBAL
|
||||
//cymbalfilter.setLowpass(0, 4500, 0.3);
|
||||
//cymbalfilter.setHighpass(1, 770, 0.7);
|
||||
cymbalfilter.setBandpass(0, 3000, .2);
|
||||
cymbaldecay.length(1000);
|
||||
#endif
|
||||
|
||||
#ifdef CLAP
|
||||
clapdecay.length(200);
|
||||
mixer3.gain(0, 0.5);
|
||||
mixer3.gain(1, 0.4);
|
||||
clapfilter.setLowpass(0, 6500, 0.4);
|
||||
clapfilter.setHighpass(1, 200, 0.3);
|
||||
#endif
|
||||
|
||||
// Master
|
||||
mixer1.gain(0, 0.75);// hat
|
||||
mixer1.gain(1, 0.75);// kik
|
||||
mixer1.gain(2, 0.65);// snr
|
||||
mixer1.gain(3, 0.75);// mix2
|
||||
|
||||
mixer2.gain(0, 0.75);// tom
|
||||
mixer2.gain(1, 0.3);//shaker
|
||||
mixer2.gain(2, 0.5);// bell
|
||||
mixer2.gain(3, 0.75);// mix3
|
||||
|
||||
// 0 and 1 are set in the clap portion, above.
|
||||
mixer3.gain(2, 0.75);//cymbal
|
||||
}
|
||||
|
||||
void paramUpdate1()
|
||||
{
|
||||
uint16_t pitch, mod, len;
|
||||
uint16_t snpitch, snmix, snlen;
|
||||
uint16_t ohdec, chdec;
|
||||
|
||||
pitch = analogRead(A1);
|
||||
mod = analogRead(A12);
|
||||
len = analogRead(A13);
|
||||
|
||||
snpitch = analogRead(A2);
|
||||
snmix = analogRead(A3);
|
||||
snlen = analogRead(A14);
|
||||
|
||||
ohdec = analogRead(A6);
|
||||
chdec = analogRead(A16);
|
||||
|
||||
#ifdef KICK
|
||||
kick.frequency(30 + (pitch >> 3));
|
||||
kick.pitchMod((float)mod/0x3ff);
|
||||
kick.length(len + 10);
|
||||
#endif
|
||||
#ifdef SNARE
|
||||
float mix = (float)snmix / 1024.0;
|
||||
snare.frequency(80 + (snpitch >> 2));
|
||||
snaremix.gain(0, 1.0 - mix);
|
||||
snaremix.gain(1, mix);
|
||||
snare.length((snlen/2) + 10);
|
||||
#endif
|
||||
#ifdef HAT
|
||||
openlen = (ohdec/2) + 10;
|
||||
closedlen = (chdec/2) + 10;
|
||||
#endif
|
||||
}
|
||||
#if 1
|
||||
|
||||
void paramUpdate2()
|
||||
{
|
||||
uint16_t p1;
|
||||
uint16_t len, mod;
|
||||
uint16_t secondskin;
|
||||
uint16_t tonebal, cymlen;;
|
||||
|
||||
p1 = analogRead(A10);
|
||||
secondskin = analogRead(A11);
|
||||
|
||||
// mod = analogRead(A18);
|
||||
// len = analogRead(A19);
|
||||
mod = 500;
|
||||
len = 500;
|
||||
|
||||
tonebal = analogRead(A7);
|
||||
cymlen = analogRead(A17);
|
||||
|
||||
// toms pitched as minor triad from base
|
||||
t3 = 30 + (p1 >> 1);
|
||||
t2 = (t3 * 6)/5; // 6/5 = minor 3rd
|
||||
t1 = t3 + (t3 >> 1);// 3/2 = perfect 5th
|
||||
|
||||
tom.length(len + 10);
|
||||
tom.pitchMod((float)mod/0x3ff);
|
||||
tom.secondMix((float)secondskin/0x3ff);
|
||||
|
||||
cymbaldecay.length((cymlen*4) + 50);
|
||||
cymbalfilter.setLowpass(0, 600+(tonebal*3), 0.3);
|
||||
cymbalfilter.setHighpass(1, 600+tonebal, 0.2);
|
||||
|
||||
//shakedecay.length(slen + 10);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void paramUpdate3()
|
||||
{
|
||||
uint16_t volume;
|
||||
uint32_t tempo;
|
||||
|
||||
//volume = analogRead(A20);
|
||||
volume = 1000-analogRead(A19);
|
||||
volume = (volume * volume) >> 10;
|
||||
volcontrol.amplitude(((float)volume)/0x3ff, 3);
|
||||
|
||||
// tempo = analogRead(A15);
|
||||
tempo = 1000-analogRead(A18);
|
||||
|
||||
tempo = 0x3ff - tempo;
|
||||
|
||||
tempo *= 225;
|
||||
tempo >>= 10;
|
||||
tempo &= 0x3ff;
|
||||
|
||||
//pause = tempo + 75;
|
||||
thePlayer.setPause(tempo+75);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void triggerKick(bool loud)
|
||||
{
|
||||
if(loud)
|
||||
{
|
||||
kick.noteOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
kick.noteOn();
|
||||
}
|
||||
}
|
||||
|
||||
void triggerSnare(bool loud)
|
||||
{
|
||||
if(loud)
|
||||
{
|
||||
snare.noteOn();
|
||||
}
|
||||
else
|
||||
{
|
||||
snare.noteOn(0x5000);
|
||||
}
|
||||
}
|
||||
|
||||
void triggerTom(int32_t num, bool loud)
|
||||
{
|
||||
if (num == 1)
|
||||
{
|
||||
tom.frequency(t1);
|
||||
tom.noteOn();
|
||||
}
|
||||
else if (num == 2)
|
||||
{
|
||||
tom.frequency(t2);
|
||||
tom.noteOn();
|
||||
}
|
||||
else if (num == 3)
|
||||
{
|
||||
tom.frequency(t3);
|
||||
tom.noteOn();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void triggerShaker(bool loud)
|
||||
{
|
||||
shakedecay.noteOn(loud?0x7fff:0x6000);
|
||||
}
|
||||
|
||||
void triggerHat(bool open, bool loud)
|
||||
{
|
||||
if (!open)
|
||||
{
|
||||
hatdecay.length(closedlen);
|
||||
hatdecay.noteOn(loud?0x7fff:0x6000);
|
||||
}
|
||||
else
|
||||
{
|
||||
hatdecay.length(openlen);
|
||||
hatdecay.noteOn(loud?0x7fff:0x6000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void triggerBell(bool loud)
|
||||
{
|
||||
belldecay.noteOn(loud?0x7fff:0x6000);
|
||||
}
|
||||
|
||||
|
||||
void triggerCymbal(bool loud)
|
||||
{
|
||||
cymbaldecay.noteOn(loud?0x7fff:0x6000);
|
||||
}
|
||||
|
||||
void triggerClap(bool loud)
|
||||
{
|
||||
// Serial.println("cymbal");
|
||||
|
||||
clapdecay.noteOn(loud?0x7fff:0x6000);
|
||||
clapenv.noteOn();
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
#ifndef _VOICE_H_
|
||||
#define _VOICE_H_
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <Audio.h>
|
||||
|
||||
void voiceInit();
|
||||
|
||||
void paramInit();
|
||||
|
||||
void paramUpdate1();
|
||||
void paramUpdate2();
|
||||
void paramUpdate3();
|
||||
|
||||
void triggerKick(bool loud = true);
|
||||
void triggerSnare(bool loud = true);
|
||||
void triggerTom(int32_t num, bool loud = true);
|
||||
void triggerShaker(bool loud = true);
|
||||
void triggerHat(bool open, bool loud = true);
|
||||
void triggerBell(bool loud = true);
|
||||
void triggerCymbal(bool loud = true);
|
||||
void triggerClap(bool loud = true);
|
||||
|
||||
#endif // keepout
|
Loading…
Reference in New Issue