设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1308|回复: 0
打印 上一主题 下一主题

[胡扯] 关于使用RM(ruby)读取并使用winmm播放midi的坑

[复制链接]

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

跳转到指定楼层
1
发表于 2013-12-6 12:46:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我弃坑了
总之还是要把成果发出来
首先你需要有一个1.9.3的ruby然后gem install midilib <几秒钟就行了
然后你就可以运行这个了
需要midilib和1.9.3.rar (8.85 KB, 下载次数: 56)
或者我也可以把代码扔出来 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

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

  -fk: -azogi:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-30 21:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表