Project1

标题: 关于使用RM(ruby)读取并使用winmm播放midi的坑 [打印本页]

作者: kuerlulu    时间: 2013-12-6 12:46
标题: 关于使用RM(ruby)读取并使用winmm播放midi的坑
我弃坑了
总之还是要把成果发出来
首先你需要有一个1.9.3的ruby然后gem install midilib <几秒钟就行了
然后你就可以运行这个了
需要midilib和1.9.3.rar (8.85 KB, 下载次数: 57)
或者我也可以把代码扔出来 FILE部分自己改文件名即可
RUBY 代码复制
  1. $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')
  2. require 'win32api'
  3. require 'midilib'
  4.  
  5. MIDIOUTOPEN = Win32API.new("winmm","midiOutOpen","pllll","l")
  6. MIDIOUTCLOSE = Win32API.new("winmm","midiOutClose","l","l")
  7. MIDIOUTSHORTMSG = Win32API.new("winmm","midiOutShortMsg","ll","l")
  8. #MCISENDSTRING = Win32API.new("winmm","mciSendString","pll","l")
  9. hmidi = [0].pack("L")
  10. MIDIOUTOPEN.call(hmidi,-1,0,0,0)
  11. $hMidiOut = hmidi.unpack("L").first
  12.  
  13. FILE = './2012822182130.mid'
  14. seq = MIDI::Sequence.new()
  15. File.open(FILE, 'rb') { | file |
  16.     seq.read(file) { | track, num_tracks, i |
  17.     }
  18. }
  19.  
  20. def MidiOutMessage (iStatus,iChannel,iData1,iData2)
  21.         dwMessage = iStatus | iChannel | (iData1 << 8) | (iData2 << 16)
  22.         return MIDIOUTSHORTMSG.call($hMidiOut, dwMessage)
  23. end
  24.  
  25. seq.each{|track|
  26.           track.each{|event|
  27.             print_decimal_numbers = true
  28.             print_note_names = true
  29.             note = event.instance_variable_get(:@note)
  30.             time = event.instance_variable_get(:@delta_time)
  31.             status = event.instance_variable_get(:@status)
  32.             channel = event.instance_variable_get(:@channel)
  33.             velocity = event.instance_variable_get(:@velocity)
  34.             print "#{note} #{time} #{status} #{channel} #{velocity}\n" if note != nil
  35.             next if note == nil
  36.             sleep(time/1000.0)
  37.             MidiOutMessage(status, channel, note, velocity)
  38.           }
  39. }
  40.  
  41. MIDIOUTCLOSE.call

以及几秒钟的演示视频:本来就转码转的渣你们就不要吐槽了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1