|
|
@ -776,6 +776,28 @@ void loop() |
|
|
|
******************************************************************************/ |
|
|
|
******************************************************************************/ |
|
|
|
void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
|
|
|
|
if (activesample < 6 && seq_running == false && LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_seq_pattern_editor) ) // live play pitched sample
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (drum_counter >= NUM_DRUMS) |
|
|
|
|
|
|
|
drum_counter = 0; |
|
|
|
|
|
|
|
uint8_t slot = drum_get_slot(drum_config[activesample].drum_class); |
|
|
|
|
|
|
|
float pan = mapfloat(drum_config[activesample].pan, -1.0, 1.0, 0.0, 1.0); |
|
|
|
|
|
|
|
drum_mixer_r.gain(slot, (1.0 - pan) * drum_config[activesample].vol_max); |
|
|
|
|
|
|
|
drum_mixer_l.gain(slot, pan * drum_config[activesample].vol_max); |
|
|
|
|
|
|
|
#ifdef USE_FX |
|
|
|
|
|
|
|
drum_reverb_send_mixer_r.gain(slot, (1.0 - pan) * volume_transform(drum_config[activesample].reverb_send)); |
|
|
|
|
|
|
|
drum_reverb_send_mixer_l.gain(slot, pan * volume_transform(drum_config[activesample].reverb_send)); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
if (drum_config[activesample].drum_data != NULL && drum_config[activesample].len > 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Drum[slot]->enableInterpolation(true); |
|
|
|
|
|
|
|
Drum[slot]->setPlaybackRate( (float)pow (2, (inNumber - 72) / 12.00) * drum_config[activesample].p_offset ); |
|
|
|
|
|
|
|
Drum[slot]->playRaw((int16_t*)drum_config[activesample].drum_data, drum_config[activesample].len, 1); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
#endif |
|
|
|
//Ignore the note when playing & recording the same note into the sequencer
|
|
|
|
//Ignore the note when playing & recording the same note into the sequencer
|
|
|
|
if (seq_recording == false || (seq_recording && inNumber != seq_note_in )) |
|
|
|
if (seq_recording == false || (seq_recording && inNumber != seq_note_in )) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -887,29 +909,29 @@ uint8_t drum_get_slot(uint8_t dt) |
|
|
|
Drum[i]->enableInterpolation(false); |
|
|
|
Drum[i]->enableInterpolation(false); |
|
|
|
Drum[i]->setPlaybackRate(1.0); |
|
|
|
Drum[i]->setPlaybackRate(1.0); |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
// else
|
|
|
|
{ |
|
|
|
// {
|
|
|
|
if (drum_type[i] == dt) |
|
|
|
// if (drum_type[i] == dt)
|
|
|
|
{ |
|
|
|
// {
|
|
|
|
#ifdef DEBUG |
|
|
|
//#ifdef DEBUG
|
|
|
|
Serial.print(F("Stopping Drum ")); |
|
|
|
// Serial.print(F("Stopping Drum "));
|
|
|
|
Serial.print(i); |
|
|
|
// Serial.print(i);
|
|
|
|
Serial.print(F(" type ")); |
|
|
|
// Serial.print(F(" type "));
|
|
|
|
Serial.println(dt); |
|
|
|
// Serial.println(dt);
|
|
|
|
#endif |
|
|
|
//#endif
|
|
|
|
Drum[i]->stop(); |
|
|
|
// Drum[i]->stop();
|
|
|
|
|
|
|
|
//
|
|
|
|
return (i); |
|
|
|
// return (i);
|
|
|
|
} |
|
|
|
// }
|
|
|
|
} |
|
|
|
// }
|
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.print(F("Using next free Drum slot ")); |
|
|
|
Serial.print(F("Using next free Drum slot ")); |
|
|
|
Serial.println(drum_counter % 4); |
|
|
|
Serial.println(drum_counter % NUM_DRUMS); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
drum_type[drum_counter % 4] = dt; |
|
|
|
drum_type[drum_counter % NUM_DRUMS] = dt; |
|
|
|
drum_counter++; |
|
|
|
drum_counter++; |
|
|
|
return (drum_counter - 1 % 4); |
|
|
|
return (drum_counter - 1 % NUM_DRUMS); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|