rtmidi 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +23 -12
- data/ext/Rakefile +48 -15
- data/ext/ruby-rtmidi.cpp +15 -4
- data/ext/ruby-rtmidi.h +22 -16
- data/ext/ruby-rtmidi.o +0 -0
- data/ext/ruby-rtmidi.so +0 -0
- data/lib/rtmidi/in.rb +1 -1
- data/lib/rtmidi/interface.rb +4 -1
- data/lib/rtmidi/out.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 951dc43b29adbc7d76f79f191f1e4a9ad6c034fd
|
4
|
+
data.tar.gz: 4733255fee9f6e321cc690594afafa8fa9e520af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9777c38f05c57c90f63c731279cb0c3d4ca3064049758d4c28c21bcd8a458900a0d51c33fff557d449bd4d7fdbfadcd6d1ecd7b4aa324f98ece78af57dc3849b
|
7
|
+
data.tar.gz: 897d148e298d4b9d76ebf953234bfe35bc5e3c76457f4395e8728cf519dacc77400a8d56375b68afbb30499b07e3c0b5587ddb45a525e1c699d74e4a9059e17d
|
data/README.md
CHANGED
@@ -4,7 +4,6 @@ Ruby-RtMidi
|
|
4
4
|
[Ruby](http://www.ruby-lang.org/) wrapper for [RtMidi](http://www.music.mcgill.ca/~gary/rtmidi/index.html),
|
5
5
|
a cross-platform C++ library for realtime MIDI input and output.
|
6
6
|
|
7
|
-
<br>
|
8
7
|
Features:
|
9
8
|
|
10
9
|
* List MIDI I/O ports
|
@@ -15,32 +14,39 @@ In other words, it can handle [channel messages](http://www.cs.cf.ac.uk/Dave/Mul
|
|
15
14
|
(notes, control change, pitch bend, pressure, program),
|
16
15
|
but there is no support for [SySex](https://en.wikipedia.org/wiki/SysEx#System_Exclusive_messages) messages yet.
|
17
16
|
|
18
|
-
<br>
|
19
17
|
Supported Platforms:
|
20
18
|
|
21
19
|
* OS X
|
22
|
-
* Windows
|
23
|
-
* Linux
|
20
|
+
* Windows
|
21
|
+
* Linux with [JACK](http://jackaudio.org/) or [ALSA](http://www.alsa-project.org)
|
24
22
|
|
25
|
-
<br>
|
26
23
|
|
27
24
|
Requirements
|
28
25
|
============
|
29
26
|
|
30
|
-
To install, you need `gcc` and `g++` on your PATH.
|
27
|
+
To install, you need `gcc` and `g++` on your PATH.
|
28
|
+
|
29
|
+
On Windows, you can use Visual Studio's `cl.exe` compiler instead.
|
30
|
+
|
31
|
+
Here's the recommended approach for your system:
|
31
32
|
|
32
33
|
OS X Setup
|
33
34
|
----------
|
34
35
|
|
35
36
|
* Install XCode via the Apple AppStore.
|
36
|
-
* Open Preferences and install
|
37
|
+
* Open XCode's Preferences and install "Command Line Tools" in the Downloads tab.
|
37
38
|
|
38
39
|
See [this stackoverflow discussion](http://stackoverflow.com/questions/9329243/xcode-4-4-command-line-tools) for help.
|
39
40
|
|
40
41
|
Windows Setup
|
41
42
|
-------------
|
42
43
|
|
43
|
-
|
44
|
+
### with [Visual Studio](http://www.microsoft.com/visualstudio) (cl.exe)
|
45
|
+
* Install [Visual Studio](http://www.microsoft.com/visualstudio) (Tested with Visual C++ 2010 Express. Any recent version with a C++ compiler should work.)
|
46
|
+
* Use the "Visual Studio Command Prompt" to install
|
47
|
+
|
48
|
+
### with [MinGW](http://www.mingw.org/) (gcc/g++)
|
49
|
+
* [Install MinGW](http://sourceforge.net/projects/mingw/files/latest/download)
|
44
50
|
* During installation, on the "Select Components" screen, install the following:
|
45
51
|
* C Compiler
|
46
52
|
* C++ Compiler
|
@@ -55,7 +61,6 @@ Linux Setup (Ubuntu)
|
|
55
61
|
sudo apt-get install jackd
|
56
62
|
sudo apt-get install libjack-dev
|
57
63
|
|
58
|
-
<br>
|
59
64
|
|
60
65
|
Installation
|
61
66
|
============
|
@@ -64,7 +69,6 @@ Assuming you have Ruby installed, and are ready to compile C++ code with `gcc`,
|
|
64
69
|
|
65
70
|
gem install rtmidi
|
66
71
|
|
67
|
-
<br>
|
68
72
|
|
69
73
|
Usage
|
70
74
|
=====
|
@@ -75,8 +79,15 @@ See the following examples:
|
|
75
79
|
* [MIDI output](http://rdoc.info/github/adamjmurray/ruby-rtmidi/file/examples/play_notes.rb)
|
76
80
|
* [MIDI input](http://rdoc.info/github/adamjmurray/ruby-rtmidi/file/examples/monitor_input.rb)
|
77
81
|
|
78
|
-
<br>
|
79
82
|
|
80
83
|
Documentation
|
81
84
|
=============
|
82
|
-
[http://rdoc.info/github/adamjmurray/ruby-rtmidi/frames](http://rdoc.info/github/adamjmurray/ruby-rtmidi/frames)
|
85
|
+
[http://rdoc.info/github/adamjmurray/ruby-rtmidi/frames](http://rdoc.info/github/adamjmurray/ruby-rtmidi/frames)
|
86
|
+
|
87
|
+
|
88
|
+
Changelog
|
89
|
+
=========
|
90
|
+
|
91
|
+
* 0.2.2 - Compilable with Visual Studio on Windows
|
92
|
+
* 0.2.1 - Linux support (thanks to [@quark-zju](https://github.com/quark-zju))
|
93
|
+
* 0.2 - First stable release
|
data/ext/Rakefile
CHANGED
@@ -25,15 +25,26 @@ def run(cmd)
|
|
25
25
|
end
|
26
26
|
|
27
27
|
|
28
|
+
require "mkmf"
|
29
|
+
COMPILER = if WINDOWS and find_executable "cl.exe"
|
30
|
+
:cl
|
31
|
+
else
|
32
|
+
if find_executable "gcc" and find_executable "g++"
|
33
|
+
:gcc
|
34
|
+
else
|
35
|
+
abort "Cannot find gcc/g++ #{'or cl.exe ' if WINDOWS}compiler"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
28
39
|
PREDEFINE, SYSTEM_LIBS = *case
|
29
|
-
when OS_X then ["
|
30
|
-
when WINDOWS then ["
|
40
|
+
when OS_X then ["__MACOSX_CORE__", "-framework CoreMIDI -framework CoreAudio -framework CoreFoundation"]
|
41
|
+
when WINDOWS then ["__WINDOWS_MM__", "-lwinmm"]
|
31
42
|
when LINUX then
|
32
43
|
defines, libs = '', ''
|
33
44
|
{:alsa => '__LINUX_ALSA__', :jack => '__UNIX_JACK__'}.select do |pkg, _|
|
34
45
|
system "pkg-config --exists #{pkg}"
|
35
46
|
end.each do |pkg, macro|
|
36
|
-
defines << "
|
47
|
+
defines << "#{macro} "
|
37
48
|
libs << `pkg-config --libs #{pkg}`.chomp
|
38
49
|
end
|
39
50
|
if defines.empty?
|
@@ -43,22 +54,44 @@ PREDEFINE, SYSTEM_LIBS = *case
|
|
43
54
|
else
|
44
55
|
end
|
45
56
|
|
57
|
+
|
58
|
+
def compile_rtmidi
|
59
|
+
cd RTMIDI_DIR
|
60
|
+
if COMPILER == :gcc
|
61
|
+
run "g++ -O3 -Wall -Iinclude -fPIC -D#{PREDEFINE} -o RtMidi.o -c RtMidi.cpp"
|
62
|
+
else
|
63
|
+
run "cl /O2 /Iinclude /D#{PREDEFINE} /EHsc /FoRtMidi.obj /c RtMidi.cpp"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def compile_ruby_rtmidi_wrapper
|
68
|
+
cd EXT_DIR
|
69
|
+
if COMPILER == :gcc
|
70
|
+
run "g++ -g -Wall -I#{RTMIDI_DIR} -fPIC -o ruby-rtmidi.o -c ruby-rtmidi.cpp"
|
71
|
+
else
|
72
|
+
run "cl /I#{RTMIDI_DIR} /D__RUBY_RTMIDI_DLL__ /EHsc /Foruby-rtmidi.obj /c ruby-rtmidi.cpp"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def create_shared_library
|
77
|
+
cd EXT_DIR
|
78
|
+
if COMPILER == :gcc
|
79
|
+
run "g++ -g -Wall -I#{RTMIDI_DIR} -I#{RTMIDI_DIR}/include -D#{PREDEFINE} -fPIC -shared -o ruby-rtmidi.so " +
|
80
|
+
"ruby-rtmidi.o #{RTMIDI_DIR}/RtMidi.o #{SYSTEM_LIBS}"
|
81
|
+
else
|
82
|
+
run "cl /I#{RTMIDI_DIR} /I#{RTMIDI_DIR}/include /D#{PREDEFINE} /LD ruby-rtmidi.obj #{RTMIDI_DIR}/RtMidi.obj winmm.lib"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
46
87
|
desc 'run the make task'
|
47
88
|
task :default => :make
|
48
89
|
|
49
|
-
desc 'build the RtMidi C++
|
90
|
+
desc 'build the RtMidi C++ library with Ruby FFI wrapper'
|
50
91
|
task :make do
|
51
|
-
|
52
|
-
abort "missing gcc" unless find_executable "gcc"
|
53
|
-
abort "missing g++" unless find_executable "g++"
|
54
|
-
|
55
|
-
cd RTMIDI_DIR
|
56
|
-
run "g++ -O3 -Wall -Iinclude -fPIC #{PREDEFINE} -c RtMidi.cpp -o RtMidi.o"
|
92
|
+
compile_rtmidi
|
57
93
|
puts
|
58
|
-
|
59
|
-
cd EXT_DIR
|
60
|
-
run "g++ -g -Wall -I#{RTMIDI_DIR} -fPIC -c ruby-rtmidi.cpp"
|
94
|
+
compile_ruby_rtmidi_wrapper
|
61
95
|
puts
|
62
|
-
|
63
|
-
"ruby-rtmidi.o #{RTMIDI_DIR}/RtMidi.o #{SYSTEM_LIBS}"
|
96
|
+
create_shared_library
|
64
97
|
end
|
data/ext/ruby-rtmidi.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "RtMidi.h"
|
2
2
|
#include "RtError.h"
|
3
3
|
#include <vector>
|
4
|
+
#include <cstring>
|
4
5
|
#include <iostream> // TODO: can probably stop including this later when done debugging
|
5
6
|
|
6
7
|
#include "ruby-rtmidi.h"
|
@@ -23,8 +24,13 @@ int midiin_port_count(rtmidi_ptr p) {
|
|
23
24
|
}
|
24
25
|
|
25
26
|
const char* midiin_port_name(rtmidi_ptr p, int port_index) {
|
26
|
-
RtMidiIn *midiin = static_cast<RtMidiIn *>(p);
|
27
|
-
|
27
|
+
RtMidiIn *midiin = static_cast<RtMidiIn *>(p);
|
28
|
+
std::string name = midiin->getPortName(port_index);
|
29
|
+
// std::string will be freed from memory at end of scope, so copy into a c string before returning.
|
30
|
+
// returning name directly caused noticeable problems when compiled with cl.exe
|
31
|
+
char* cstr = new char [name.length()+1];
|
32
|
+
std::strcpy(cstr, name.c_str());
|
33
|
+
return cstr;
|
28
34
|
}
|
29
35
|
|
30
36
|
void midiin_open_port(rtmidi_ptr p, int port_index) {
|
@@ -84,8 +90,13 @@ int midiout_port_count(rtmidi_ptr p) {
|
|
84
90
|
}
|
85
91
|
|
86
92
|
const char* midiout_port_name(rtmidi_ptr p, int port_index) {
|
87
|
-
RtMidiOut *midiout = static_cast<RtMidiOut *>(p);
|
88
|
-
|
93
|
+
RtMidiOut *midiout = static_cast<RtMidiOut *>(p);
|
94
|
+
std::string name = midiout->getPortName(port_index);
|
95
|
+
// std::string will be freed from memory at end of scope, so copy into a c string before returning.
|
96
|
+
// returning name directly caused noticeable problems when compiled with cl.exe
|
97
|
+
char* cstr = new char [name.length()+1];
|
98
|
+
std::strcpy(cstr, name.c_str());
|
99
|
+
return cstr;
|
89
100
|
}
|
90
101
|
|
91
102
|
void midiout_open_port(rtmidi_ptr p, int port_index) {
|
data/ext/ruby-rtmidi.h
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
#ifdef __RUBY_RTMIDI_DLL__
|
2
|
+
#define DLL_EXPORT __declspec( dllexport ) // export function definitions for Windows DLL compiled via cl.exe
|
3
|
+
#else
|
4
|
+
#define DLL_EXPORT
|
5
|
+
#endif
|
6
|
+
|
1
7
|
extern "C"
|
2
8
|
{
|
3
9
|
typedef void* rtmidi_ptr;
|
@@ -6,39 +12,39 @@ extern "C"
|
|
6
12
|
//================================================
|
7
13
|
// INPUT
|
8
14
|
|
9
|
-
rtmidi_ptr midiin_new();
|
15
|
+
DLL_EXPORT rtmidi_ptr midiin_new();
|
10
16
|
|
11
|
-
void midiin_delete(rtmidi_ptr midiin);
|
17
|
+
DLL_EXPORT void midiin_delete(rtmidi_ptr midiin);
|
12
18
|
|
13
|
-
int midiin_port_count(rtmidi_ptr midiin);
|
19
|
+
DLL_EXPORT int midiin_port_count(rtmidi_ptr midiin);
|
14
20
|
|
15
|
-
const char* midiin_port_name(rtmidi_ptr midiin, int port_index);
|
21
|
+
DLL_EXPORT const char* midiin_port_name(rtmidi_ptr midiin, int port_index);
|
16
22
|
|
17
|
-
void midiin_open_port(rtmidi_ptr p, int port_index);
|
23
|
+
DLL_EXPORT void midiin_open_port(rtmidi_ptr p, int port_index);
|
18
24
|
|
19
|
-
void midiin_close_port(rtmidi_ptr p);
|
25
|
+
DLL_EXPORT void midiin_close_port(rtmidi_ptr p);
|
20
26
|
|
21
|
-
void midiin_ignore_types(rtmidi_ptr p, bool sysex, bool timing, bool active_sensing);
|
27
|
+
DLL_EXPORT void midiin_ignore_types(rtmidi_ptr p, bool sysex, bool timing, bool active_sensing);
|
22
28
|
|
23
|
-
void midiin_set_callback(rtmidi_ptr p, rtmidi_callback callback);
|
29
|
+
DLL_EXPORT void midiin_set_callback(rtmidi_ptr p, rtmidi_callback callback);
|
24
30
|
|
25
|
-
void midiin_cancel_callback(rtmidi_ptr p);
|
31
|
+
DLL_EXPORT void midiin_cancel_callback(rtmidi_ptr p);
|
26
32
|
|
27
33
|
|
28
34
|
//================================================
|
29
35
|
// OUTPUT
|
30
36
|
|
31
|
-
rtmidi_ptr midiout_new();
|
37
|
+
DLL_EXPORT rtmidi_ptr midiout_new();
|
32
38
|
|
33
|
-
void midiout_delete(rtmidi_ptr midiout);
|
39
|
+
DLL_EXPORT void midiout_delete(rtmidi_ptr midiout);
|
34
40
|
|
35
|
-
int midiout_port_count(rtmidi_ptr midiout);
|
41
|
+
DLL_EXPORT int midiout_port_count(rtmidi_ptr midiout);
|
36
42
|
|
37
|
-
const char* midiout_port_name(rtmidi_ptr midiout, int port_index);
|
43
|
+
DLL_EXPORT const char* midiout_port_name(rtmidi_ptr midiout, int port_index);
|
38
44
|
|
39
|
-
void midiout_open_port(rtmidi_ptr p, int port_index);
|
45
|
+
DLL_EXPORT void midiout_open_port(rtmidi_ptr p, int port_index);
|
40
46
|
|
41
|
-
void midiout_close_port(rtmidi_ptr p);
|
47
|
+
DLL_EXPORT void midiout_close_port(rtmidi_ptr p);
|
42
48
|
|
43
|
-
void midiout_send_message(rtmidi_ptr p, int byte1, int byte2, int byte3);
|
49
|
+
DLL_EXPORT void midiout_send_message(rtmidi_ptr p, int byte1, int byte2, int byte3);
|
44
50
|
};
|
data/ext/ruby-rtmidi.o
CHANGED
Binary file
|
data/ext/ruby-rtmidi.so
CHANGED
Binary file
|
data/lib/rtmidi/in.rb
CHANGED
data/lib/rtmidi/interface.rb
CHANGED
@@ -5,7 +5,10 @@ module RtMidi
|
|
5
5
|
# @see RtMidi::Out
|
6
6
|
module Interface
|
7
7
|
extend FFI::Library
|
8
|
-
ffi_lib
|
8
|
+
ffi_lib [
|
9
|
+
File.expand_path("../../ext/ruby-rtmidi.so", File.dirname(__FILE__)),
|
10
|
+
File.expand_path("../../ext/ruby-rtmidi.dll", File.dirname(__FILE__))
|
11
|
+
]
|
9
12
|
|
10
13
|
#####################################
|
11
14
|
# INPUT
|
data/lib/rtmidi/out.rb
CHANGED