Skip to content

Commit 157e084

Browse files
committed
MIDI In support to aid on previewing the plugins
1 parent c5fea10 commit 157e084

23 files changed

+4487
-27
lines changed

SConstruct

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ opts.Add(EnumVariable("platform","Platform to build",detected_platform,("windows
2222
opts.Add(BoolVariable("enable_rtaudio","Use RtAudio as Sound Driver",True))
2323
opts.Add(BoolVariable("use_jack","Use Jack with RtAudio",False))
2424
opts.Add(BoolVariable("use_pulseaudio","Use Pulseaudio with RtAudio",True))
25-
opts.Add(BoolVariable("use_alsa","Use Alsa with RtAudio",True))
25+
opts.Add(BoolVariable("use_alsa","Use Alsa with RtAudio and RtMidi",True))
2626
opts.Add(BoolVariable("enable_vst2","Enable VST2",True))
2727
opts.Add(BoolVariable("use_wasapi","Enable Wasapi",True))
2828
opts.Add(BoolVariable("use_directsound","Enable Wasapi",True))
29+
opts.Add(BoolVariable("enable_rtmidi","Use RtMidi as MIDI Driver",True))
30+
opts.Add(BoolVariable("use_winmm","Enable WinMM for RtMidi",True))
2931

3032
opts.Update(env) # update environment
3133
Help(opts.GenerateHelpText(env)) # generate help
@@ -37,36 +39,40 @@ if (detected_platform==""):
3739
if (env["enable_rtaudio"]):
3840

3941
env.Append(CXXFLAGS=["-DRTAUDIO_ENABLED"])
40-
if (env["platform"]=="windows"):
41-
if (env["use_wasapi"]):
42-
env.Append(CXXFLAGS=["-D__WINDOWS_WASAPI__"])
43-
if (env["use_directsound"]):
44-
env.Append(CXXFLAGS=["-D__WINDOWS_DS__"])
45-
#env.Append(CXXFLAGS=["-D__WINDOWS_ASIO__"])
46-
env.Append(LIBS=["dsound","mfplat","mfuuid","wmcodecdspuuid","ksuser"])
47-
48-
if (env["platform"]=="freedesktop"):
49-
50-
if (env["use_pulseaudio"]):
51-
env.Append(CXXFLAGS=["-D__LINUX_PULSE__"])
52-
env.ParseConfig("pkg-config libpulse --libs --cflags")
53-
env.ParseConfig("pkg-config libpulse-simple --libs --cflags")
54-
if (env["use_alsa"]):
55-
env.Append(CXXFLAGS=["-D__LINUX_ALSA__"])
56-
env.ParseConfig("pkg-config alsa --libs --cflags")
57-
if (env["use_jack"]):
58-
env.Append(CXXFLAGS=["-D__LINUX_JACK__"])
59-
env.ParseConfig("pkg-config jack --libs --cflags")
42+
43+
if (env["enable_rtmidi"]):
44+
45+
env.Append(CXXFLAGS=["-DRTMIDI_ENABLED"])
46+
6047

6148
if (env["platform"]=="windows"):
6249
env.Append(CXXFLAGS=["-DWINDOWS_ENABLED"])
6350
if (env["enable_vst2"]):
6451
env.Append(CXXFLAGS=["-DVST2_ENABLED"])
52+
if (env["use_wasapi"]):
53+
env.Append(CXXFLAGS=["-D__WINDOWS_WASAPI__"])
54+
if (env["use_directsound"]):
55+
env.Append(CXXFLAGS=["-D__WINDOWS_DS__"])
56+
if (env["use_winmm"]):
57+
env.Append(CXXFLAGS=["-D__WINDOWS_MM__"])
58+
59+
#env.Append(CXXFLAGS=["-D__WINDOWS_ASIO__"])
60+
env.Append(LIBS=["dsound","mfplat","mfuuid","wmcodecdspuuid","ksuser"])
6561

6662

6763
if (env["platform"]=="freedesktop"):
6864
env["enable_vst2"]=False # not supported
6965
env.Append(CXXFLAGS=["-DFREEDESKTOP_ENABLED"])
66+
if (env["use_pulseaudio"]):
67+
env.Append(CXXFLAGS=["-D__LINUX_PULSE__"])
68+
env.ParseConfig("pkg-config libpulse --libs --cflags")
69+
env.ParseConfig("pkg-config libpulse-simple --libs --cflags")
70+
if (env["use_alsa"]):
71+
env.Append(CXXFLAGS=["-D__LINUX_ALSA__"])
72+
env.ParseConfig("pkg-config alsa --libs --cflags")
73+
if (env["use_jack"]):
74+
env.Append(CXXFLAGS=["-D__LINUX_JACK__"])
75+
env.ParseConfig("pkg-config jack --libs --cflags")
7076

7177
def add_sources(self, sources, filetype, lib_env = None, shared = False):
7278
import glob;

bin/zytrax.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
#include "drivers/rtaudio/sound_driver_rtaudio.h"
1414
#endif
1515

16+
#ifdef RTMIDI_ENABLED
17+
#include "drivers/rtmidi/midi_driver_rtmidi.h"
18+
#endif
1619
int main(int argc, char *argv[]) {
1720

1821
AudioEffectFactory effect_factory;
@@ -26,6 +29,9 @@ int main(int argc, char *argv[]) {
2629
register_rtaudio_driver();
2730
#endif
2831

32+
#ifdef RTMIDI_ENABLED
33+
register_rtmidi_driver();
34+
#endif
2935
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.examples.base");
3036

3137
Theme theme;
@@ -35,19 +41,21 @@ int main(int argc, char *argv[]) {
3541
{
3642
String path = SettingsDialog::get_settings_path() + "/settings.json";
3743
JSON::Node node;
38-
int use_driver_index = 0;
44+
int use_driver_index = SoundDriverManager::get_driver_count() ? 0 : -1;
45+
int use_midi_in_driver_index = MIDIDriverManager::get_input_driver_count() ? 0 : -1;
3946

4047
if (load_json(path, node) == OK) {
4148

4249
if (node.has("audio")) { //audio
4350
JSON::Node audio_node = node.get("audio");
4451
std::string driver_id = audio_node.get("id").toString();
45-
int use_driver_index = -1;
52+
4653
for (int i = 0; i < SoundDriverManager::get_driver_count(); i++) {
4754
SoundDriver *driver = SoundDriverManager::get_driver(i);
4855
if (driver->get_id() == driver_id.c_str()) {
56+
use_driver_index = i;
4957
}
50-
use_driver_index = i;
58+
5159
break;
5260
}
5361

@@ -65,6 +73,17 @@ int main(int argc, char *argv[]) {
6573
if (block_size >= 0 && block_size < SoundDriverManager::BUFFER_SIZE_MAX) {
6674
SoundDriverManager::set_step_buffer_size(SoundDriverManager::BufferSize(block_size));
6775
}
76+
77+
std::string midi_driver_id = audio_node.get("midi_in_id").toString();
78+
79+
for (int i = 0; i < MIDIDriverManager::get_input_driver_count(); i++) {
80+
MIDIInputDriver *driver = MIDIDriverManager::get_input_driver(i);
81+
if (driver->get_id() == midi_driver_id.c_str()) {
82+
use_midi_in_driver_index = i;
83+
}
84+
85+
break;
86+
}
6887
}
6988

7089
if (node.has("plugins")) { //plugins
@@ -157,6 +176,7 @@ int main(int argc, char *argv[]) {
157176
}
158177
}
159178
SoundDriverManager::init_driver(use_driver_index);
179+
MIDIDriverManager::init_input_driver(use_midi_in_driver_index);
160180
}
161181

162182
register_effects(&effect_factory);

drivers/SCsub

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ if (env["enable_rtaudio"]):
99
env.add_sources(targets,"rtaudio/*.cpp")
1010
env.add_sources(targets,"rtaudio/rtaudio/*.cpp")
1111

12+
if (env["enable_rtmidi"]):
13+
env.add_sources(targets,"rtmidi/*.cpp")
14+
env.add_sources(targets,"rtmidi/rtmidi/*.cpp")
15+
1216
env.libs+=env.Library('drivers', targets);
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#include "midi_driver_rtmidi.h"
2+
3+
#include "engine/midi_driver_manager.h"
4+
#include "globals/vector.h"
5+
//
6+
#include "drivers/rtmidi/rtmidi/RtMidi.h"
7+
8+
static RtMidiIn *midiin = NULL;
9+
10+
class MIDIInputDriverRtMidi : public MIDIInputDriver {
11+
public:
12+
static void midi_callback(double deltatime, std::vector<unsigned char> *message, void *userData) {
13+
MIDIInputDriverRtMidi *driver = (MIDIInputDriverRtMidi *)userData;
14+
MIDIEvent ev;
15+
if (ev.parse(&(*message)[0]) == OK) {
16+
driver->event(deltatime, ev);
17+
}
18+
}
19+
20+
virtual void lock() {
21+
}
22+
virtual void unlock() {
23+
}
24+
25+
String name;
26+
String id;
27+
int index;
28+
bool active;
29+
30+
virtual String get_name() const {
31+
return name;
32+
}
33+
virtual String get_id() const {
34+
return id;
35+
}
36+
37+
virtual bool is_active() {
38+
return active;
39+
}
40+
virtual bool init() {
41+
ERR_FAIL_COND_V(active, false);
42+
midiin->openPort(index);
43+
// Set our callback function. This should be done immediately after
44+
// opening the port to avoid having incoming messages written to the
45+
// queue.
46+
midiin->setCallback(&midi_callback, this);
47+
// Don't ignore sysex, timing, or active sensing messages.
48+
midiin->ignoreTypes(false, false, false);
49+
active = true;
50+
}
51+
virtual void finish() {
52+
midiin->closePort();
53+
active = false;
54+
}
55+
56+
MIDIInputDriverRtMidi() {
57+
index = -1;
58+
active = false;
59+
}
60+
~MIDIInputDriverRtMidi() {
61+
}
62+
};
63+
64+
static Vector<MIDIInputDriverRtMidi *> midi_drivers;
65+
66+
void register_rtmidi_driver() {
67+
68+
midiin = new RtMidiIn();
69+
70+
unsigned int nPorts = midiin->getPortCount();
71+
for (int i = 0; i < nPorts; i++) {
72+
MIDIInputDriverRtMidi *driver = new MIDIInputDriverRtMidi;
73+
driver->name.parse_utf8(midiin->getPortName(i).c_str());
74+
driver->id = "RtMidi:" + driver->name;
75+
driver->index = i;
76+
midi_drivers.push_back(driver);
77+
MIDIDriverManager::add_input_driver(driver);
78+
}
79+
}
80+
81+
void unregister_rtmidi_driver() {
82+
for (int i = 0; i < midi_drivers.size(); i++) {
83+
delete midi_drivers[i];
84+
}
85+
delete midiin;
86+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef MIDI_DRIVER_RTMIDI_H
2+
#define MIDI_DRIVER_RTMIDI_H
3+
4+
//
5+
6+
void register_rtmidi_driver();
7+
void unregister_rtmidi_driver();
8+
9+
#endif // MIDI_DRIVER_RTMIDI_H

0 commit comments

Comments
 (0)