Skip to content
Merged
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
39 changes: 29 additions & 10 deletions src/audio_decoder_midi.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,15 @@ constexpr int sample_divider = 1;
#endif
constexpr int samples_per_play = 64 / sample_divider;

static const uint8_t midi_event_control_change = 0b1011;
static const uint8_t midi_control_volume = 7;
static const uint8_t midi_control_all_sound_off = 120;
//static const uint8_t midi_control_all_note_off = 123;
static const uint8_t midi_control_reset_all_controller = 121;
static const uint8_t midi_set_reg_param_upper = 0x6;
static const uint8_t midi_control_volume = 0x7;
static const uint8_t midi_event_control_change = 0xB;
static const uint8_t midi_set_reg_param_lower = 0x26;
//static const uint8_t midi_control_all_sound_off = 0x78;
static const uint8_t midi_control_reset_all_controller = 0x79;
//static const uint8_t midi_control_all_note_off = 0x7B;
static const uint8_t midi_set_reg_param_number_lower = 0x64;
static const uint8_t midi_set_reg_param_number_upper = 0x65;

static uint32_t midimsg_make(uint8_t event_type, uint8_t channel, uint8_t value1, uint8_t value2) {
uint32_t msg = 0;
Expand All @@ -53,11 +57,11 @@ static uint32_t midimsg_make(uint8_t event_type, uint8_t channel, uint8_t value1

/*static uint32_t midimsg_all_note_off(uint8_t channel) {
return midimsg_make(midi_event_control_change, channel, midi_control_all_note_off, 0);
}*/
}

static uint32_t midimsg_all_sound_off(uint8_t channel) {
return midimsg_make(midi_event_control_change, channel, midi_control_all_sound_off, 0);
}
}*/

static uint32_t midimsg_volume(uint8_t channel, uint8_t volume) {
return midimsg_make(midi_event_control_change, channel, midi_control_volume, volume);
Expand Down Expand Up @@ -117,6 +121,7 @@ bool AudioDecoderMidi::Open(Filesystem_Stream::InputStream stream) {
return false;
}
seq->rewind();
tempo.clear();
tempo.emplace_back(this, midi_default_tempo);
mtime = seq->get_start_skipping_silence();
seq->play(mtime, this);
Expand Down Expand Up @@ -223,7 +228,7 @@ void AudioDecoderMidi::Update(std::chrono::microseconds delta) {
if (paused) {
return;
}
if (fade_steps >= 0 && mtime - last_fade_mtime > 0.1s) {
if (fade_steps > 0 && mtime - last_fade_mtime > 0.1s) {
volume = Utils::Clamp<float>(volume + delta_volume_step, 0.0f, 1.0f);
if (!mididec->SupportsMidiMessages()) {
log_volume = AdjustVolume(volume * 100.0f);
Expand Down Expand Up @@ -373,12 +378,26 @@ void AudioDecoderMidi::meta_event(int event, const void* data, std::size_t size)

void AudioDecoderMidi::reset() {
// MIDI reset event
SendMessageToAllChannels(midimsg_all_sound_off(0));
SendMessageToAllChannels(midimsg_reset_all_controller(0));

// GM system on (resets most parameters)
const unsigned char gm_reset[] = {0xF0, 0x7E, 0x7F, 0x09, 0x01, 0xF7};
const unsigned char gm_reset[] = { 0xF0, 0x7E, 0x7F, 0x09, 0x01, 0xF7 };
mididec->SendSysExMessage(gm_reset, sizeof(gm_reset));

// Set the Pitch bend range to 256
for (int channel = 0; channel < 16; channel++) {
auto midi_msg = midimsg_make(midi_event_control_change, channel, midi_set_reg_param_number_upper, 0);
mididec->SendMidiMessage(midi_msg);

midi_msg = midimsg_make(midi_event_control_change, channel, midi_set_reg_param_number_lower, 0);
mididec->SendMidiMessage(midi_msg);

midi_msg = midimsg_make(midi_event_control_change, channel, midi_set_reg_param_upper, 2);
mididec->SendMidiMessage(midi_msg);

midi_msg = midimsg_make(midi_event_control_change, channel, midi_set_reg_param_lower, 0);
mididec->SendMidiMessage(midi_msg);
}
}

void AudioDecoderMidi::reset_tempos_after_loop() {
Expand Down