Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion RadioMusic/AudioEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ void AudioEngine::changeTo(AudioFileInfo* fileInfo, unsigned long start) {
currentFileInfo = fileInfo;

// Re-apply speed limits
if(settings->pitchMode) {
if((settings->pitchMode == Settings::PitchMode::Speed) || (settings->pitchMode == Settings::PitchMode::PotSpeedCvStart)) {
setPlaybackSpeed(currentPlayer->playbackSpeed);
}

Expand Down
2 changes: 1 addition & 1 deletion RadioMusic/FileScanner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void FileScanner::scan(File* root, Settings& settings) {
// TODO : remove this when looping is fixed for 24 bit
settings.looping = false;
settings.hardSwap = true;
settings.pitchMode = true;
settings.pitchMode = Settings::PitchMode::Speed;
D(
Serial.print("Finished Tip Top with "); Serial.print(lastBankIndex); Serial.println(" active banks"););
} else {
Expand Down
197 changes: 121 additions & 76 deletions RadioMusic/Interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,24 +37,43 @@ void Interface::init(int fileSize, int channels, const Settings& settings, PlayS

pitchMode = settings.pitchMode;

if(pitchMode) {
quantiseRootCV = settings.quantiseRootCV;
quantiseRootPot = settings.quantiseRootPot;

float lowNote = settings.lowNote + 0.5;
startCVInput.setRange(lowNote, lowNote + settings.noteRange, quantiseRootCV);
startPotInput.setRange(0.0,48, quantiseRootPot);
startCVInput.borderThreshold = 64;
startPotInput.borderThreshold = 64;
} else {
D(Serial.print("Set Start Range ");Serial.println(ADC_MAX_VALUE / startCVDivider););
startPotInput.setRange(0.0, ADC_MAX_VALUE / startCVDivider, false);
startCVInput.setRange(0.0, ADC_MAX_VALUE / startCVDivider, false);
startPotInput.setAverage(true);
startCVInput.setAverage(true);
startCVInput.borderThreshold = 32;
startPotInput.borderThreshold = 32;
}
switch(pitchMode) {
default:
case Settings::PitchMode::Start: {
D(Serial.print("Set Start Range ");Serial.println(ADC_MAX_VALUE / startCVDivider););
startPotInput.setRange(0.0, ADC_MAX_VALUE / startCVDivider, false);
startPotInput.setAverage(true);
startPotInput.borderThreshold = 32;

startCVInput.setRange(0.0, ADC_MAX_VALUE / startCVDivider, false);
startCVInput.setAverage(true);
startCVInput.borderThreshold = 32;
break;
}
case Settings::PitchMode::Speed: {
quantiseRootPot = settings.quantiseRootPot;
startPotInput.setRange(0.0,48, quantiseRootPot);
startPotInput.borderThreshold = 64;

quantiseRootCV = settings.quantiseRootCV;
float lowNote = settings.lowNote + 0.5;
startCVInput.setRange(lowNote, lowNote + settings.noteRange, quantiseRootCV);
startCVInput.borderThreshold = 64;
break;
}
case Settings::PitchMode::PotSpeedCvStart: {
quantiseRootPot = settings.quantiseRootPot;
startPotInput.setRange(0.0,48, quantiseRootPot);
startPotInput.borderThreshold = 64;

startCVInput.setRange(0.0, ADC_MAX_VALUE / startCVDivider, false);
startCVInput.setAverage(true);
startCVInput.borderThreshold = 32;

break;
}

}

channelPotImmediate = settings.chanPotImmediate;
channelCVImmediate = settings.chanCVImmediate;
Expand All @@ -80,10 +99,12 @@ void Interface::setChannelCount(uint16_t count) {
uint16_t Interface::update() {

uint16_t channelChanged = updateChannelControls();
uint16_t startChanged = pitchMode ? updateRootControls() : updateStartControls();
uint16_t startChanged = updateStartControls();
uint16_t rootChanged = updateRootControls();

changes = channelChanged;
changes |= startChanged;
changes |= rootChanged;
changes |= updateButton();

if(resetCVHigh || (changes & BUTTON_SHORT_PRESS)) {
Expand Down Expand Up @@ -129,26 +150,44 @@ uint16_t Interface::updateChannelControls() {
}

uint16_t Interface::updateStartControls() {
uint16_t changes = 0;

boolean cvChanged = startCVInput.update();
boolean potChanged = startPotInput.update();
if(pitchMode == Settings::PitchMode::Speed) {
return 0;
}

uint16_t changes = 0;

if(potChanged) {
changes |= TIME_POT_CHANGED;
if(startPotImmediate) {
changes |= CHANGE_START_NOW;
if(pitchMode == Settings::PitchMode::Start) {
boolean potChanged = startPotInput.update();
if(potChanged) {
changes |= TIME_POT_CHANGED;
if(startPotImmediate) {
changes |= CHANGE_START_NOW;
}
}
}

if(cvChanged) {
changes |= TIME_CV_CHANGED;
if(startCVImmediate) {
changes |= CHANGE_START_NOW;
if((pitchMode == Settings::PitchMode::Start) || (pitchMode == Settings::PitchMode::PotSpeedCvStart)) {
boolean cvChanged = startCVInput.update();
if(cvChanged) {
changes |= TIME_CV_CHANGED;
if(startCVImmediate) {
changes |= CHANGE_START_NOW;
}
}
}

start = constrain(((startCVInput.currentValue * startCVDivider) + (startPotInput.currentValue * startCVDivider)),0,ADC_MAX_VALUE);
switch(pitchMode) {
default:
case Settings::PitchMode::Start: {
start = constrain(((startCVInput.currentValue * startCVDivider) + (startPotInput.currentValue * startCVDivider)),0,ADC_MAX_VALUE);
break;
}
case Settings::PitchMode::PotSpeedCvStart: {
start = constrain(((startCVInput.currentValue * startCVDivider)),0,ADC_MAX_VALUE);
break;
}
}

if(changes) {
// D(
Expand All @@ -168,56 +207,62 @@ uint16_t Interface::updateStartControls() {
// return bitmap of state of changes for CV, Pot and combined Note.
uint16_t Interface::updateRootControls() {

uint16_t change = 0;
if (pitchMode == Settings::PitchMode::Start) {
return 0;
}

boolean cvChanged = startCVInput.update();
boolean potChanged = startPotInput.update();
uint16_t change = 0;

// early out if no changes
if(!cvChanged && !potChanged) {
return change;
}
if(pitchMode == Settings::PitchMode::Speed) {
boolean cvChanged = startCVInput.update();
if(cvChanged) {
D(Serial.println("CV Changed"););
float rootCV = startCVInput.currentValue;
if(quantiseRootCV) {
rootNoteCV = floor(rootCV);
if(rootNoteCV != rootNoteCVOld) {
D(Serial.print("CV ");Serial.println(startCVInput.inputValue););
change |= ROOT_CV_CHANGED;
}
} else {
rootNoteCV = rootCV;
change |= ROOT_CV_CHANGED;
}
}
}

float rootPot = startPotInput.currentValue;
float rootCV = startCVInput.currentValue;

if(cvChanged) {
D(
Serial.println("CV Changed");
);
if(quantiseRootCV) {
rootNoteCV = floor(rootCV);
if(rootNoteCV != rootNoteCVOld) {
D(
Serial.print("CV ");Serial.println(startCVInput.inputValue);
);
change |= ROOT_CV_CHANGED;
}
} else {
rootNoteCV = rootCV;
change |= ROOT_CV_CHANGED;
}
}
if((pitchMode == Settings::PitchMode::Speed) || (pitchMode == Settings::PitchMode::PotSpeedCvStart)) {
boolean potChanged = startPotInput.update();
if(potChanged) {
D(Serial.println("Pot Changed"););
float rootPot = startPotInput.currentValue;
if(quantiseRootPot) {
rootNotePot = floor(rootPot);
if(rootNotePot != rootNotePotOld) {
D(Serial.print("Pot ");Serial.println(startPotInput.inputValue););
change |= ROOT_POT_CHANGED;
}
} else {
rootNotePot = rootPot;
change |= ROOT_POT_CHANGED;
}
}
}

if(potChanged) {
D(
Serial.println("Pot Changed");
);
if(quantiseRootPot) {
rootNotePot = floor(rootPot);
if(rootNotePot != rootNotePotOld) {
D(
Serial.print("Pot ");Serial.println(startPotInput.inputValue);
);
change |= ROOT_POT_CHANGED;
}
} else {
rootNotePot = rootPot;
change |= ROOT_POT_CHANGED;
}
}
if(!change)
return 0;

rootNote = rootNoteCV + rootNotePot;
switch(pitchMode) {
default:
case Settings::PitchMode::Speed: {
rootNote = rootNoteCV + rootNotePot;
break;
}
case Settings::PitchMode::PotSpeedCvStart: {
rootNote = 24 + rootNotePot;
break;
}
}

// Flag note changes when the note index itself changes
if(floor(rootNote) != rootNoteOld) {
Expand Down
2 changes: 1 addition & 1 deletion RadioMusic/Interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class Interface {
uint16_t updateChannelControls();
uint16_t updateStartControls();
uint16_t updateRootControls();
boolean pitchMode = false;
Settings::PitchMode pitchMode = Settings::PitchMode::Start;
};

#endif
36 changes: 24 additions & 12 deletions RadioMusic/RadioMusic.ino
Original file line number Diff line number Diff line change
Expand Up @@ -317,20 +317,33 @@ uint16_t checkInterface() {
bool skipToStartPoint = false;
bool speedChange = false;

if(settings.pitchMode) {

if(resetTriggered) {
skipToStartPoint = true;
switch(settings.pitchMode) {
default:
case Settings::PitchMode::Start: {
if((changes & CHANGE_START_NOW) || resetTriggered) {
skipToStartPoint = true;
}
break;
}
case Settings::PitchMode::Speed: {
if(resetTriggered) {
skipToStartPoint = true;
}

if((changes & (ROOT_NOTE_CHANGED | ROOT_POT_CHANGED | ROOT_CV_CHANGED) ) || resetTriggered) {
speedChange = true;
if((changes & (ROOT_NOTE_CHANGED | ROOT_POT_CHANGED | ROOT_CV_CHANGED) ) || resetTriggered) {
speedChange = true;
}
break;
}
case Settings::PitchMode::PotSpeedCvStart: {
if((changes & CHANGE_START_NOW) || resetTriggered) {
skipToStartPoint = true;
}

} else {

if((changes & CHANGE_START_NOW) || resetTriggered) {
skipToStartPoint = true;
if((changes & (ROOT_NOTE_CHANGED | ROOT_POT_CHANGED) ) || resetTriggered) {
speedChange = true;
}
break;
}
}

Expand All @@ -344,13 +357,12 @@ uint16_t checkInterface() {

if(speedChange) doSpeedChange();
if(skipToStartPoint && !playState.channelChanged) {
if(settings.pitchMode) {
if(settings.pitchMode == Settings::PitchMode::Speed) {
audioEngine.skipTo(0);
} else {
D(Serial.print("Skip to ");Serial.println(interface.start););
audioEngine.skipTo(interface.start);
}

}

return changes;
Expand Down
12 changes: 6 additions & 6 deletions RadioMusic/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ void Settings::read() {
// startPotImmediate = true;
// quantiseRootPot = true;
// quantiseRootCV = true;
// pitchMode = true;
// pitchMode = PitchMode::Start;
// startCVDivider = 1;

#ifdef TEST_RADIO_MODE
Expand All @@ -100,7 +100,7 @@ void Settings::read() {
#endif

if(!loopMode) {
if(pitchMode) {
if(pitchMode == PitchMode::Speed) {
loopMode = LOOP_MODE_START_POINT;
} else {
loopMode = LOOP_MODE_RADIO;
Expand All @@ -109,7 +109,7 @@ void Settings::read() {

D(Serial.print("Loop mode ");Serial.println(loopMode););

if(anyAudioFiles || pitchMode) {
if(anyAudioFiles || (pitchMode == PitchMode::Speed)) {
hardSwap = true;
}
}
Expand All @@ -126,7 +126,7 @@ void Settings::drumMode() {
startCVDivider=1;
looping=1;
sort=1;
pitchMode=1;
pitchMode = PitchMode::Speed;
hardSwap = true;
anyAudioFiles = true;
loopMode = LOOP_MODE_START_POINT;
Expand All @@ -144,7 +144,7 @@ void Settings::radioMode() {
startCVDivider=2;
looping=1;
sort=1;
pitchMode=0;
pitchMode = PitchMode::Start;
hardSwap = false;
anyAudioFiles = false;
loopMode = LOOP_MODE_RADIO;
Expand Down Expand Up @@ -211,7 +211,7 @@ void Settings::applySetting(String settingName, String settingValue) {
}

if(settingName.equalsIgnoreCase("pitchMode")) {
pitchMode = toBoolean(settingValue);
pitchMode = settingValue.toInt();
}

if(settingName.equalsIgnoreCase("hardSwap")) {
Expand Down
7 changes: 6 additions & 1 deletion RadioMusic/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,12 @@ class Settings {
boolean sort = true; // By default we sort the directory contents.

// Use start pot and cv to control speed instead of start point
boolean pitchMode = false;
enum PitchMode : uint8_t {
Start,
Speed,
PotSpeedCvStart
};
PitchMode pitchMode = PitchMode::Start;

// If this is true we'll read any .wav files and try to play them
// if not we'll only play 44khz, 16bit mono files
Expand Down