forked from W4D/soundcube-firmware
almost a complete sequencer... almost
This commit is contained in:
@ -95,6 +95,25 @@ struct Config {
|
||||
|
||||
Config config;
|
||||
|
||||
struct Sample{
|
||||
float volume = 1.0;
|
||||
WaveStream *file;
|
||||
};
|
||||
|
||||
Sample samples[NSTREAMS];
|
||||
|
||||
struct SequenceStep{
|
||||
int len = 0;
|
||||
Sample *samples[4];
|
||||
void trigger(){
|
||||
for(int i = 0; i < len; i++){
|
||||
samples[i]->file->play(true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
SequenceStep steps[16];
|
||||
|
||||
void loadConfiguration(Config& config) {
|
||||
File file = SD.open("/config.txt");
|
||||
JsonDocument doc;
|
||||
@ -116,7 +135,7 @@ void loadConfiguration(Config& config) {
|
||||
config.ring_color.g_active = doc["ring"]["color"]["active"]["g"] | 80;
|
||||
config.ring_color.b_active = doc["ring"]["color"]["active"]["b"] | 50;
|
||||
|
||||
JsonArray _sampleFiles = doc["sampleFiles"];
|
||||
JsonArray _sampleFiles = doc["samples"];
|
||||
config.boxid = doc["boxid"].as<String>();
|
||||
int i = 0;
|
||||
for(JsonVariant item : _sampleFiles){
|
||||
@ -208,9 +227,10 @@ bool load_samples(){
|
||||
stream[i].begin();
|
||||
char filename[64];
|
||||
sprintf(filename, "/sound/%s/%s", config.boxid.c_str(), config.sampleFiles[i].c_str());
|
||||
Serial.println(filename);
|
||||
|
||||
if(SD.exists(filename)){
|
||||
bool loaded = stream[i].load(SD.open(filename));
|
||||
|
||||
if(loaded) {
|
||||
Serial.print("file read: ");
|
||||
Serial.print(stream[i].wavefile.length);
|
||||
@ -230,9 +250,9 @@ bool load_samples(){
|
||||
} else {
|
||||
for(int k = 0; k < 3; k++){
|
||||
digitalWrite(6, HIGH);
|
||||
delay(100);
|
||||
delay(20);
|
||||
digitalWrite(6, LOW);
|
||||
delay(50);
|
||||
delay(25);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -303,7 +323,7 @@ void setup() {
|
||||
|
||||
// Rotary Encoder
|
||||
ENC.begin(); // set direction pin.
|
||||
ENC.setDirection(AS5600_COUNTERCLOCK_WISE);
|
||||
ENC.setDirection(AS5600_CLOCK_WISE);
|
||||
ENC.resetCumulativePosition();
|
||||
|
||||
pinMode(6, OUTPUT); // Vibration Motor
|
||||
@ -345,6 +365,12 @@ void setup() {
|
||||
streams_loaded = load_samples();
|
||||
}
|
||||
|
||||
if(streams_loaded) {
|
||||
for(int i = 0; i < NSTREAMS; i++){
|
||||
samples[i].file = &stream[i];
|
||||
}
|
||||
}
|
||||
|
||||
digitalWrite(6, HIGH);
|
||||
delay(25);
|
||||
digitalWrite(6, LOW);
|
||||
@ -352,13 +378,13 @@ void setup() {
|
||||
digitalWrite(6, HIGH);
|
||||
delay(25);
|
||||
digitalWrite(6, LOW);
|
||||
|
||||
}
|
||||
|
||||
bool dactest = false;
|
||||
uint32_t last = 0;
|
||||
bool tick = false;
|
||||
int bar = 0;
|
||||
int bar_old = -1;
|
||||
int set_bar = 0;
|
||||
|
||||
void loop() {
|
||||
@ -429,10 +455,8 @@ void loop() {
|
||||
}
|
||||
|
||||
// Set bar
|
||||
if(buttons[BACK]) set_bar++;
|
||||
if(buttons[POWER]) set_bar--;
|
||||
if(set_bar == 16) set_bar = 0;
|
||||
if(set_bar == -1) set_bar = 15;
|
||||
// if(buttons[BACK]) set_bar++;
|
||||
// if(buttons[POWER]) set_bar--;
|
||||
|
||||
if(buttons[DEBUG1]) {
|
||||
Serial.println("vol down");
|
||||
@ -450,9 +474,13 @@ void loop() {
|
||||
}
|
||||
|
||||
if(buttons[SELECT]){
|
||||
stream[active % NSTREAMS].toggle();
|
||||
ui_beep = true;
|
||||
//stream[active % NSTREAMS].toggle();
|
||||
//ui_beep = true;
|
||||
|
||||
int n = steps[set_bar].len;
|
||||
steps[set_bar].samples[n] = &samples[0];
|
||||
steps[set_bar].len = (steps[set_bar].len + 1) % 4;
|
||||
|
||||
// Flash encoder leds
|
||||
ui_leds[0] = CRGB(0, 100, 50);
|
||||
ui_leds[1] = CRGB(0, 100, 50);
|
||||
@ -464,6 +492,12 @@ void loop() {
|
||||
buttonChanged = false;
|
||||
}
|
||||
|
||||
if(position < 0) position += 4096;
|
||||
set_bar = (position / 256) % 16;
|
||||
|
||||
// if(set_bar == 16) set_bar = 0;
|
||||
// if(set_bar == -1) set_bar = 15;
|
||||
|
||||
//dac.setValue(0, dactest ? 0 : sin((float)millis() / 100.0f) * 32768 + 32768);
|
||||
|
||||
// empty LED matrix
|
||||
@ -477,16 +511,27 @@ void loop() {
|
||||
|
||||
|
||||
for(int i = 0; i < 48; i++){
|
||||
if(floor(i/3) == set_bar){
|
||||
int step = floor(i/3);
|
||||
if(step == set_bar){
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r_active, config.ring_color.g_active, config.ring_color.b_active);
|
||||
}
|
||||
if(floor(i/3) == bar){
|
||||
if(step == bar){
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(config.ring_color.r, config.ring_color.g, config.ring_color.b);
|
||||
}
|
||||
if(steps[step].len > 0) {
|
||||
ui_leds[lut_ring_cw[i]] = CRGB(0, 10, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(bar != bar_old){
|
||||
if(steps[bar].len > 0) {
|
||||
steps[bar].trigger();
|
||||
Serial.print("trigger ");
|
||||
Serial.println(bar);
|
||||
}
|
||||
}
|
||||
|
||||
// if(position < 0) position += 4096;
|
||||
// active_led_ring = (position / 32) % 48;
|
||||
|
||||
// // set active LED ring LED
|
||||
// for(int i = 0; i < active_led_ring; i++){
|
||||
@ -504,5 +549,5 @@ void loop() {
|
||||
if(i2s.getUnderflow()) Serial.println("underflow");
|
||||
|
||||
//delay(20); // wait 1ms
|
||||
|
||||
bar_old = bar;
|
||||
}
|
||||
@ -74,16 +74,21 @@ struct WaveFile{
|
||||
return true;
|
||||
}
|
||||
|
||||
void readblock(){
|
||||
bool readblock(){
|
||||
uint8_t samplebyte[blockalign];
|
||||
|
||||
file.read(samplebyte, blockalign);
|
||||
if(!file.available() && loop) file.seek(44, SeekSet);
|
||||
if(!file.available() && !loop) {
|
||||
file.seek(44, SeekSet);
|
||||
return false;
|
||||
}
|
||||
|
||||
for(int i = 0; i < blockalign; i+=2){
|
||||
int16_t sample = (samplebyte[i+1] << 8) + samplebyte[i];
|
||||
buffer.push(sample);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
int16_t get(){
|
||||
@ -94,6 +99,10 @@ struct WaveFile{
|
||||
file.seek(44, SeekSet);
|
||||
}
|
||||
|
||||
void reset(){
|
||||
file.seek(44, SeekSet);
|
||||
}
|
||||
|
||||
bool loop = false;
|
||||
uint16_t format = 0;
|
||||
uint32_t length = 0;
|
||||
@ -121,7 +130,10 @@ class WaveStream{
|
||||
|
||||
void toggle(){playing = !playing;}
|
||||
|
||||
void play(){playing = true;}
|
||||
void play(bool reset = false){
|
||||
if(reset) wavefile.reset();
|
||||
playing = true;
|
||||
}
|
||||
|
||||
void stop(){
|
||||
playing = false;
|
||||
@ -134,7 +146,8 @@ class WaveStream{
|
||||
if(!wavefile.buffer.isFull() && playing){
|
||||
int cnt = 0;
|
||||
while (!wavefile.buffer.isFull() && cnt < 6000) {
|
||||
wavefile.readblock();
|
||||
bool ok = wavefile.readblock();
|
||||
if(!ok) playing = false;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user