忍者ブログ

GAM-22のメモ

HSPで、MIDIサウンドを鳴らす (winmm.dll)

2024.04 ← 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 →

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

HSPで、MIDIサウンドを鳴らす (winmm.dll)

HSPコンテスト2008も終わり、HSPを触ることとも少なくなると思うので、忘れないうちに記事にしようと思います。軽くwinmm.dllを使う方法を紹介したいと思います。

最近コンテストで、HSPTV部門なのに音が出るプログラムを見かけることがあります。私もそれがやりたくて実装してみた作品が「蟲」だったりします。

具体的にはこんな流れになります。

  1. midiOutOpenでMIDIデバイスをオープン
  2. midiOutShortMsgでチャンネルに音色番号を設定
  3. midiOutShortMsgで音を鳴らす
  4. midiOutCloseでMIDIデバイスをクローズ

けっこう簡単なのですが、引数を計算する為に構造体を扱うことになります。それだけが厄介です。

文章で説明するより、ソースを弄って体験してみたほうが理解しやすい気がします。楽器などの変数を変えてみたりして遊んでください。

何が起きているのか、ちゃんと理解したいならここが参考になります。

同時に16の音を重ねられますが、チャンネル番号9だけは、ドラムメンバ専用なので、違う感じになります。ここでは、チャンネル番号0~7まで使っています。


    // winmm.dll
    #uselib "winmm.dll"
    #func midiOutOpen "midiOutOpen" int, int, int, int, int
    #func midiOutShortMsg "midiOutShortMsg" int, int
    #func midiOutClose "midiOutClose" int

    // 置き換え
    #define ctype midi_msg(%1,%2,%3) %1 | (%2<<8) | (%3<<16)
    #const 音色 $C0
    #const 発音 $90
    #const 停止 $80

    // セットアップ
    midiOutOpen varptr(midi), 0, 0, 0, 0
    onexit *exit

    repeat 8
        // 再生
        楽器 = 102; (0~127)
        音階 = 60+cnt; (0~127)
        音量 = 100; (0~127)
        midiOutShortMsg midi, midi_msg(音色+cnt, 楽器 ,0)
        midiOutShortMsg midi, midi_msg(発音+cnt, 音階 ,音量)
        wait 50
        loop

    repeat 8
        // 停止
        音階 = 60+cnt
        midiOutShortMsg midi, midi_msg(停止+cnt, 音階 ,音量)
        wait 50
        loop

    stop

*exit
    // 使用終了
    midiOutClose varptr(midi)
    end

基本的に楽器の音のみですが、爆風やレーザーっぽい音色もあります。

楽器によって、停止するまで永遠に鳴ったり、勝手に停止したりします。

    // winmm.dll
    #uselib "winmm.dll"
    #func midiOutOpen "midiOutOpen" int, int, int, int, int
    #func midiOutShortMsg "midiOutShortMsg" int, int
    #func midiOutClose "midiOutClose" int

    // 置き換え
    #define ctype midi_msg(%1,%2,%3) %1 | (%2<<8) | (%3<<16)
    #const 音色 $C0
    #const 発音 $90
    #const 停止 $80

    // セットアップ
    midiOutOpen varptr(midi), 0, 0, 0, 0
    onexit *exit

    ; 爆音風
    midiOutShortMsg midi, midi_msg(音色, 127 ,0)
    midiOutShortMsg midi, midi_msg(発音, 10 ,100)

    ; ↓この楽器は勝手に停止するので必要なし
    ; midiOutShortMsg midi, midi_msg(停止, 10 ,100)

    stop

*exit
    // 使用終了
    midiOutClose varptr(midi)
    end
PR
この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
HSPTV部門で音を鳴らす方法を探してました。
今回のコンテスト(2009)では出せないかもしれませんが、機会を見つけて挑戦しようと思いました。ありがとうございました。

夏休みの勉強頑張ってくださいね。
まるむし屋さん / 2009/08/16(Sun) / 編集
HSP関連のコメントは初です
はじめまして。
HSP関連の記事をちょくちょく書いているのですが、コメントが付いたのは初めてです。記事にした甲斐があったというものです。

改めて自分の記事を見返して、間違いがあったので、修正しました。
midiOutCloseのパラメータに、varptr(midi)を渡さないと、MIDIデバイスの解放に失敗します。修正しておいたので、確認しておいてくださいね。

>夏休みの勉強頑張ってくださいね。
個人的なことなので、アレですが、物理と世界史と地理がヤバイです。
数学も全く解けない問題が数問…
 (2009/08/17)
この記事にトラックバックする
トラックバックURL:
カテゴリー
カウンター
最新記事
最新コメント
Twitter
人気記事
Amazon お買い得情報
Amazon お買い得情報
プロフィール
自画像
HN :
GAM-22
性別:
男性
職業:
大学1年生
HSP暦:
6年
好きなもの :
ゲーム, アニメ, マヨネーズ
嫌いなもの :
運動, 注射, ホラー映画, 英語
好きなバンド :
Muse, Radiohead
その他 :
文章能力が欠如している
バナー
Copyright © GAM-22のメモ All Rights Reserved
Powered by ニンジャブログ Designed by ピンキー・ローン・ピッグ 忍者ブログ / [PR]