新しく発言する EXIT インデックスへ
質問

  質問 M.U 2004/12/16 15:49:27 
  簡単な音だけならBEEPで出せますが2004/12/16 16:49:38 
   └もう一つ、***.wavファイルをサウンドレコー...2004/12/16 17:06:45 
    └wavファイルを再生するのなら独自拡張の 青木太一 2004/12/16 18:30:22 
     └返事遅れてすいません M.U 2004/12/17 21:51:42 

  質問 M.U 2004/12/16 15:49:27  ツリーへ

質問 返事を書く
M.U 2004/12/16 15:49:27
十進BASICで音を出すプログラムを作りたいのですがどのようにすればいいのでしょうか?

  簡単な音だけならBEEPで出せますが2004/12/16 16:49:38  ツリーへ

Re: 質問 返事を書く
2004/12/16 16:49:38
簡単な音だけなら BEEPで出せますが
音色までこだわるならWinAPIを呼び出すことになり少々面倒ですがこんな感じです。
DECLARE EXTERNAL FUNCTION midiOpen
DECLARE EXTERNAL FUNCTION midiMsg
DECLARE EXTERNAL FUNCTION midiClose
! 利用可能なMIDIデバイスの数を獲得
DECLARE EXTERNAL FUNCTION midiGet
OPTION CHARACTER byte ! 文字サイズを1バイトにする

LET hmid$=REPEAT$("*",4) ! 四バイト分用意

LET Note=70 !音階(&H00から&H7F(127))
LET Inst=0 !楽器No(GM音色番号に準拠?)
LET Vol=BVAL("7F",16) !音量(&H00から&H7F(127))

IF midiGet<1 THEN STOP ! MIDIデバイスがなければ終了
LET n=midiOpen(hMid$, -1, 0, 0, 0)

! 文字列を数値に変換
LET hMidiOut=0
LET k=1
FOR i=1 TO 4
LET hMidiOut = hMidiOut + k*ORD(hMid$(i:i))
LET k = k*256
NEXT i

LET n=midiMsg(hMidiOut, BVAL("c0",16) + Inst * 256)
LET n=midiMsg(hMidiOut, BVAL("90",16) + Note * 256 + Vol * 256 * 256)
WAIT DELAY 1
LET n=midiMsg(hMidiOut, BVAL("80",16) + Note * 256)
LET n=midiClose(hMidiOut)

END

EXTERNAL FUNCTION midiOpen(lphMidiOut$,uDeviceID,dwCallback,dwInstance,dwFlags)
ASSIGN "winmm.dll","midiOutOpen"
END FUNCTION

EXTERNAL FUNCTION midiMsg(hMid,Dt)
ASSIGN "winmm.dll","midiOutShortMsg"
END FUNCTION

EXTERNAL FUNCTION midiClose(hMid)
ASSIGN "winmm.dll","midiOutClose"
END FUNCTION

EXTERNAL FUNCTION midiGet
ASSIGN "winmm.dll","midiOutGetNumDevs"
END FUNCTION

   └もう一つ、***.wavファイルをサウンドレコー...2004/12/16 17:06:45  ツリーへ

Re: 簡単な音だけならBEEPで出せますが 返事を書く
2004/12/16 17:06:45
もう一つ、***.wav ファイルをサウンドレコーダ等で作って呼び出す方法です。

DECLARE EXTERNAL FUNCTION PlaySound

LET S$="***.wav"
LET n=PlaySound(S$, "", 128)
END

EXTERNAL FUNCTION PlaySound(pszSound$, hmod$, fdwSound)
ASSIGN "winmm.dll","PlaySoundA"
END FUNCTION

    └wavファイルを再生するのなら独自拡張の 青木太一 2004/12/16 18:30:22  ツリーへ

Re: もう一つ、***.wavファイルをサウンドレコー... 返事を書く
青木太一 2004/12/16 18:30:22
wavファイルを再生するのなら独自拡張の
play
を使った方が簡単で素直ではないでしょうか?
WindowsAPIを利用した方がきめ細かい制御が可能なのかもしれませんが...

LET S$="***.wav"
play S$
END

それにしても、WindowsAPIをぜんぜん知らない私には、
哲さんの書き込みは勉強になります。

P.S.
なぜか私の環境ではplayをつかったとき、ファイルがアプリケーションが関連づけられていないとエラーがでました。
(関連づけられているはずなんだけどなー...)
再現性を確認できたら正式にバグ報告します。

     └返事遅れてすいません M.U 2004/12/17 21:51:42  ツリーへ

Re: wavファイルを再生するのなら独自拡張の 返事を書く
M.U 2004/12/17 21:51:42
返事遅れてすいません
ご丁寧なご返事ありがとうございます


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。