diff --git a/src/midi.cpp b/src/midi.cpp index 8ebd181..9672c14 100644 --- a/src/midi.cpp +++ b/src/midi.cpp @@ -48,7 +48,8 @@ extern "C" uint8_t* midi_parse(uint8_t in) midiParser.isMidiStatus(midiXparser::noteOnStatus) || midiParser.isMidiStatus(midiXparser::noteOffStatus) || midiParser.isMidiStatus(midiXparser::programChangeStatus) || - midiParser.isMidiStatus(midiXparser::controlChangeStatus) + midiParser.isMidiStatus(midiXparser::controlChangeStatus) || + midiParser.isMidiStatus(midiXparser::pitchBendStatus) ) { msg = midiParser.getMidiMsg(); @@ -76,7 +77,8 @@ extern "C" uint8_t* usb_midi_parse(uint8_t in) usbMidiParser.isMidiStatus(midiXparser::noteOnStatus) || usbMidiParser.isMidiStatus(midiXparser::noteOffStatus) || usbMidiParser.isMidiStatus(midiXparser::programChangeStatus) || - usbMidiParser.isMidiStatus(midiXparser::controlChangeStatus) + usbMidiParser.isMidiStatus(midiXparser::controlChangeStatus) || + usbMidiParser.isMidiStatus(midiXparser::pitchBendStatus) ) { usb_msg = usbMidiParser.getMidiMsg(); @@ -104,7 +106,8 @@ extern "C" uint8_t* web_midi_parse(uint8_t in) webMidiParser.isMidiStatus(midiXparser::noteOnStatus) || webMidiParser.isMidiStatus(midiXparser::noteOffStatus) || webMidiParser.isMidiStatus(midiXparser::programChangeStatus) || - webMidiParser.isMidiStatus(midiXparser::controlChangeStatus) + webMidiParser.isMidiStatus(midiXparser::controlChangeStatus) || + webMidiParser.isMidiStatus(midiXparser::pitchBendStatus) ) { web_msg = webMidiParser.getMidiMsg(); diff --git a/src/midi_in.c b/src/midi_in.c index 229acea..e67c93a 100644 --- a/src/midi_in.c +++ b/src/midi_in.c @@ -350,6 +350,7 @@ static void handle_midi(uint8_t *msg) uint8_t fine = msg[1]; uint8_t coarse = msg[2]; channel_pitch_bend[channel] = (coarse << 7) | fine; + // log_e("pb:%d", channel_pitch_bend[channel]); } case MIDI_CC: { diff --git a/src/wav_player.c b/src/wav_player.c index a74c597..9b52669 100644 --- a/src/wav_player.c +++ b/src/wav_player.c @@ -235,10 +235,13 @@ void update_pitch_bends(void) uint16_t pitch_bend = channel_pitch_bend[i]; s15p16 bend = (pitch_bend << 16) / 8192.0 - ( 1 << 16); - s15p16 semitones = bend >= 0 ? metadata.pitch_bend_semitones_up * bend : metadata.pitch_bend_semitones_down * bend; - s15p16 exponent = semitones / 12; - s15p16 pitch_factor = fxexp2_s15p16(exponent); - pitch_bend_factor[i] = pitch_factor; + s15p16 semitones = bend >= 0 ? 2 * bend : 2 * bend; + // s15p16 semitones = bend >= 0 ? metadata.pitch_bend_semitones_up * bend : metadata.pitch_bend_semitones_down * bend; + s15p16 pitch_factor = fxexp2_s15p16(semitones / 12); + channel_pitch_bend_factor[i] = pitch_factor; + // if(i==0){ + // log_e("set %d", pitch_factor); // 58387 (/ 65536) + // } } } @@ -294,7 +297,7 @@ int16_t IRAM_ATTR scale_sample_clamped_16(int in, uint8_t volume) { int16_t out = (in > MAX_INT_16) ? MAX_INT_16 : (in < MIN_INT_16) ? MIN_INT_16 : in; // return (int16_t)(out * lin_response_lut[volume].val); - return (int16_t)((out * lin_response_lut[vol].val) >> 16); + return (int16_t)((out * lin_response_lut[volume].val) >> 16); } bool is_playing(uint8_t voice, uint8_t note) @@ -383,7 +386,7 @@ void IRAM_ATTR update_stereo_volume(uint8_t buf) uint8_t chan = bufs[buf].wav_player_event.channel; uint32_t left = channel_vol[chan] * channel_exp[chan] * channel_pan[chan].left_vol * bufs[buf].volume; uint32_t right = channel_vol[chan] * channel_exp[chan] * channel_pan[chan].right_vol * bufs[buf].volume; - bufs[buf].stereo_volume.left = (uint8_t)(left / 2048383); // 127*127*127*127 + bufs[buf].stereo_volume.left = (uint8_t)(left / 2048383); // 127*127*127 bufs[buf].stereo_volume.right = (uint8_t)(right / 2048383); } @@ -619,7 +622,7 @@ void IRAM_ATTR wav_player_task(void* pvParameters) case ONE_SHOT: { size_t remaining = bufs[buf].size - bufs[buf].wav_position; - u16p16 step = pitch_factor[buf]; + u16p16 step = channel_pitch_bend_factor[bufs[buf].wav_player_event.channel]; if(bufs[buf].fade == 0) // dont update stereo volume while fading {