Forum: Ruby ruby midi problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
8a7a74182e801b31248d51cf8d94f2d5?d=identicon&s=25 rick_2047 (Guest)
on 2008-12-20 08:56
(Received via mailing list)
Ok i was going through the book "Ruby practical Projects" and right at
the first chapter i had this problem. The first chapter is all about
calling the alsa raw midi functions in ruby to play midi from ruby. I
think i did everything right but still i get no sound. I debuged my
project but at the lines when the function call is made nothing
happens, there is not even an error. Can anybody give me any pointers
to what should i do. Here is my code ..
 1 require 'dl/import'
  2
  3 class LiveMIDI
  4         ON = 0x90
  5         OFF = 0x80
  6         PC = 0xC0
  7
  8         def initialize
  9                 open
 10         end
 11
 12         def note_on(channel, note, velocity=64)
 13                 message(ON | channel, note, velocity)
 14         end
 15
 16         def note_off(channel, note, velocity=64)
 17                 message(OFF | channel, note, velocity)
 18         end
 19
 20         def program_change(channel, preset)
 21                 message(PC | channel, preset)
 22         end
 23 end
 24
 25 if RUBY_PLATFORM.include?('mswin')
 26         class LiveMIDI
 27                 # Windows code here
 28                 module C
 29                         extend DL::Importable
 30                         dlload 'winmm'
 31
 32
 33                         extern "int midiOutOpen(HMIDIOUT*, int,
int, int, int)"
 34                         extern "int midiOutClose(int)"
 35                         extern "int midiOutShortMsg(int, int)"
 36                 end
 37                 def open
 38                         @device = DL.malloc(DL.sizeof('I'))
 39                         C.midiOutOpen(@device, -1, 0, 0, 0)
 40                 end
 41                 def close
 42                         C.midiOutClose(@device.ptr.to_i)
 43                 end
 44                 def message(one, two=0, three=0)
 45                         message = one + (two << 8) + (three << 16)
 46                         C.midiOutShortMsg(@device.ptr.to_i,
message)
 47                 end
 48         end
 49
 50 elsif RUBY_PLATFORM.include?('darwin')
 51         class LiveMIDI
 52                 # Mac code here
 53         end
 54 elsif RUBY_PLATFORM.include?('linux')
 55         class LiveMIDI
 56                 module C
 57                         extend DL::Importable
 58                         dlload '/usr/lib/libasound.so.2.0.0'
 59
 60
 61                         extern "int snd_rawmidi_open(void*, void*,
char*, int)"
 62                         extern "int snd_rawmidi_close(void*)"
 63                         extern "int snd_rawmidi_write(void*,
void*, int)"
 64                         extern "int snd_rawmidi_drain(void*)"
 65                 end
 66
 67                 def open
 68                         @output = DL::PtrData.new(nil)
 69                         C.snd_rawmidi_open(nil,
@output.ref,"virtual",0)
 70                 end
 71
 72                 def close
 73                         C.snd_rawmidi_close(@output)
 74                 end
 75
 76                 def message(*args)
 77                         format= "C" * args.size
 78                         bytes = args.pack(format).to_ptr
 79                         C.snd_rawmidi_write(@output, bytes,
args.size)
 80                         C.snd_rawmidi_drain(@output)
 81                 end
 82         end
 83 else
 84         raise "Couldn't find a LiveMIDI implementation for your
platform"
 85 end
 86
 87
 88 #require 'music'
 89 midi = LiveMIDI.new
 90 sleep(8)
 91 midi.note_on(0,60,100)
 92 sleep(1)
 93 midi.note_off(0,60)
 94 sleep(1)
 95 midi.program_change(1,40)
 96 midi.note_on(1,60,100)
 97 sleep(1)
 98 midi.note_off(1,60)
 99 puts "done"

of course you could skip the windows part coz i never tested it
anyways.
90a73d9875462aaa9fab2feffafbffe7?d=identicon&s=25 Ben Bleything (Guest)
on 2008-12-21 05:22
(Received via mailing list)
On Sat, Dec 20, 2008, rick_2047 wrote:
> Ok i was going through the book "Ruby practical Projects" and right at
> the first chapter i had this problem. The first chapter is all about
> calling the alsa raw midi functions in ruby to play midi from ruby. I
> think i did everything right but still i get no sound. I debuged my
> project but at the lines when the function call is made nothing
> happens, there is not even an error. Can anybody give me any pointers
> to what should i do. Here is my code ..

A couple of things!

1) Did you follow the steps to patch the MIDI output to your
synthesizer?  I've had good luck with qjackctl.

2) If you're just doing this as an exercise, cool... if not, you should
check out MIDIator, which just packages up the Practical Ruby Projects
code in a gem with some extra niceness :)  But, if you're trying to
learn please do continue with the book.

Ben
8a7a74182e801b31248d51cf8d94f2d5?d=identicon&s=25 rick_2047 (Guest)
on 2008-12-21 20:42
(Received via mailing list)
I have tried qjackctl but i still don't get any sound, everything goes
fine i start timidity and qjackctl the connection is fine but i get no
audio.
90a73d9875462aaa9fab2feffafbffe7?d=identicon&s=25 Ben Bleything (Guest)
on 2008-12-23 22:48
(Received via mailing list)
On Mon, Dec 22, 2008, rick_2047 wrote:
> I have tried qjackctl but i still don't get any sound, everything goes
> fine i start timidity and qjackctl the connection is fine but i get no
> audio.

Don't know what to tell you then, sorry.  If you have access to a
Windows or OSX machine, you might want to try your code there to try to
isolate it to being a linux problem.

Ben
This topic is locked and can not be replied to.