From bcfcb91cca5d1242aed854575848894a9d1e79a4 Mon Sep 17 00:00:00 2001 From: Nanako <469449812@qq.com> Date: Tue, 23 Jul 2024 21:08:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BD=93=E6=9A=82=E5=81=9C?= =?UTF-8?q?=E6=97=B6=E5=8F=91=E9=80=81midi=20note=20all=20stop=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/audio/midi_sequencer/midi_sequencer.cpp | 17 ++++++++++++++--- core/audio/midi_sequencer/midi_sequencer.h | 8 +++----- core/audio/plugin_host/plugin_host.cpp | 5 +++++ core/audio/plugin_host/plugin_host.h | 1 + 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/core/audio/midi_sequencer/midi_sequencer.cpp b/core/audio/midi_sequencer/midi_sequencer.cpp index 4c9d4bf..91ab892 100644 --- a/core/audio/midi_sequencer/midi_sequencer.cpp +++ b/core/audio/midi_sequencer/midi_sequencer.cpp @@ -13,7 +13,7 @@ IMPL_SINGLETON_INSTANCE(midi_sequencer) void midi_sequencer::test() { - const char* path = R"(F:\VST\VST64\4Front Piano x64.dll)"; + const char* path = R"(F:\VST\VST64\Serum_x64.dll)"; // host->try_open_editor(); smf::MidiFile midifile("E:/Projects/AronaStudio/Arona/resources/1.mid"); @@ -21,7 +21,7 @@ void midi_sequencer::test() { spdlog::critical("Error reading MIDI file"); midifile.doTimeAnalysis(); midifile.linkNotePairs(); - midifile.joinTracks(); + // midifile.joinTracks(); auto c = get_midi_sequencer()->create_clip(); auto track_count = midifile.getTrackCount(); for (int i = 0; i < track_count; ++i) { @@ -45,7 +45,7 @@ void midi_sequencer::init(singleton_initliazer& initliazer) { singleton_t::init(initliazer); auto adm = initliazer.require(); adm->on_sample_rate_changed.add_raw(this, &midi_sequencer::on_sample_rate_changed); - set_bpm(140.0); + set_bpm(200.0); } void midi_sequencer::process(double sample_rate, uint32_t delta_frames) { @@ -59,6 +59,17 @@ void midi_sequencer::process(double sample_rate, uint32_t delta_frames) { update_vst2_time_info(); } +auto midi_sequencer::toggle_play() -> bool { + playing_ = !playing_; + if (!playing_) { + auto instruments = g_plugin_host_manager.get_instrument_hosts(); + for (auto instrument : instruments) { + instrument->push_stop_all_notes(); + } + } + return playing_; +} + auto midi_sequencer::create_clip_instance(clip* clip) -> clip_instance* { auto instance = new clip_instance(clip); clip_instances_.push_back(instance); diff --git a/core/audio/midi_sequencer/midi_sequencer.h b/core/audio/midi_sequencer/midi_sequencer.h index d8c921c..9f06355 100644 --- a/core/audio/midi_sequencer/midi_sequencer.h +++ b/core/audio/midi_sequencer/midi_sequencer.h @@ -1,4 +1,5 @@ #pragma once +#include #include #include "misc/tick.h" @@ -14,10 +15,7 @@ public: void init(singleton_initliazer& initliazer) override; void process(double sample_rate, uint32_t delta_frames); - auto toggle_play() -> bool { - playing_ = !playing_; - return playing_; - } + auto toggle_play() -> bool ; template auto create_clip() -> T* { @@ -44,7 +42,7 @@ protected: private: void update_vst2_time_info(); - bool playing_ = false; + std::atomic playing_ = false; double bpm_ = 0; double sample_pos_ = 0; int32_t tpq_pos_ = 0; diff --git a/core/audio/plugin_host/plugin_host.cpp b/core/audio/plugin_host/plugin_host.cpp index 31beb0b..efb7e7e 100644 --- a/core/audio/plugin_host/plugin_host.cpp +++ b/core/audio/plugin_host/plugin_host.cpp @@ -24,6 +24,11 @@ void plugin_host::on_update_buffer_size(int buffer_size) } } +void plugin_host::push_stop_all_notes(uint32_t frame_delta) { + smf::MidiEvent event(0xB0, 0x7B, 0x00); + push_midi(event, frame_delta); +} + void plugin_host::try_open_editor() { if (!has_editor()) return; diff --git a/core/audio/plugin_host/plugin_host.h b/core/audio/plugin_host/plugin_host.h index fe53e6a..31dd821 100644 --- a/core/audio/plugin_host/plugin_host.h +++ b/core/audio/plugin_host/plugin_host.h @@ -59,6 +59,7 @@ public: virtual void process(uint32_t frame_num) = 0; virtual void push_midi(const smf::MidiEvent& event, uint32_t frame_delta) = 0; + void push_stop_all_notes(uint32_t frame_delta = 0); void try_open_editor();