録音する
録音する方法
録音する方法には、DirectSound、WaveIn○○関数、MCI等があります。
DirectSoundを現在のABで使うには難があります。
WaveIn○○関数を使う方法は、かなり細かい作業ができますが、そのかわり面倒です。
簡単な録音方法としてMCIを使います。
MCIを使う
MCI(MediaControlInterface)はWindowsの音声、動画などメディアを操るAPIです。
単純な録音、再生ならMCIで十分です。再生できるファイルはWINDOWSフォルダにあるWIN.INIに書かれています。
MCIを使うために必要な関数はmciSendCommand関数1つだけです。
この関数を使ってデバイスにメッセージを送ります。
再生の手順は以下のようになります。
録音なら
録音するプログラム
MCI_SETでサンプリングレートやビット数の設定を行っています。音質はCDと同じ44.1KHz,16bit,2chです。
ABでは、ファイルapi_mmsys.sbpでマルチメディア関連の関数や定数などが定義されています。
しかし全てが定義されていませんので、ある程度自分でしなければならないものが出てきます。
とりあえず、プログラムです。説明はとくに要らないと思います。
'MCIを使った録音
#console
#include<vcrt71.sbp>
#include<api_mmsys.sbp>'これが必要
'api_mmsys.sbpに無い構造体、定数
Type MCI_SAVE_PARMS
dwCallback As DWord
lpfilename As *Byte
End Type
Type MCI_WAVE_SET_PARMS
dwCallback As DWORD
dwTimeFormat As DWORD
dwAudio As DWORD
wInput As DWORD
wOutput As DWORD
wFormatTag As WORD
wReserved2 As WORD
nChannels As WORD
wReserved3 As WORD
nSamplesPerSec As DWORD
nAvgBytesPerSec As DWORD
nBlockAlign As WORD
wReserved4 As WORD
wBitsPerSample As WORD
wReserved5 As WORD
End Type
Const MCI_SAVE_FILE = &h00000100
Const WAVE_FORMAT_PCM = 1
'------------------------------------------------------------
Dim mop As MCI_OPEN_PARMS
Dim msp As MCI_SAVE_PARMS
Dim mwsp As MCI_WAVE_SET_PARMS
/*
* 録音開始
* filename : 作成ファイル名
*****************************/
Sub rec_start(filename As *Byte)
Dim ret As DWord
'初期設定
mop.lpstrElementName = ""
mop.lpstrDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO
msp.lpfilename = filename
mwsp.wFormatTag=WAVE_FORMAT_PCM
mwsp.nChannels=2 'チャンネル
mwsp.wBitsPerSample=16 '量子化ビット数
mwsp.nSamplesPerSec=44100 'サンプリングレート
mwsp.nBlockAlign=mwsp.nChannels * mwsp.wBitsPerSample/8
mwsp.nAvgBytesPerSec=mwsp.nSamplesPerSec * mwsp.nBlockAlign
ret = mciSendCommand(0 , MCI_OPEN , _
MCI_OPEN_TYPE or MCI_OPEN_TYPE_ID or MCI_OPEN_ELEMENT , _
mop)
If ret <> 0 Then printf(Ex"エラー:MCI_OPEN\n")
ret = mciSendCommand(mop.wDeviceID , MCI_SET , _
MCI_WAVE_SET_FORMATTAG or _
MCI_WAVE_SET_CHANNELS or _
MCI_WAVE_SET_SAMPLESPERSEC or _
MCI_WAVE_SET_AVGBYTESPERSEC or _
MCI_WAVE_SET_BLOCKALIGN or _
MCI_WAVE_SET_BITSPERSAMPLE ,_
mwsp)
If ret <> 0 Then printf(Ex"エラー:MCI_SET\n")
ret = mciSendCommand(mop.wDeviceID , MCI_RECORD ,0 ,ByVal 0)
If ret <> 0 Then printf(Ex"エラー:MCI_RECORD\n")
End Sub
/*
* 録音したものをファイルに保存
*****************************/
Sub rec_stop()
Dim ret As DWord
ret = mciSendCommand(mop.wDeviceID , MCI_STOP , MCI_WAIT ,ByVal NULL)
If ret <> 0 Then printf(Ex"エラー:MCI_STOP\n")
ret = mciSendCommand(mop.wDeviceID , MCI_SAVE , MCI_WAIT or MCI_SAVE_FILE , msp)
If ret <> 0 Then printf(Ex"エラー:MCI_SAVE\n")
ret = mciSendCommand(mop.wDeviceID , MCI_CLOSE , 0 ,ByVal 0)
If ret <> 0 Then printf(Ex"エラー:MCI_CLOSE\n")
End Sub
/*
* ここから実行 - main
*******************************/
rec_start("test.wav")'録音開始
printf(Ex"録音中...\n")
getchar()'エンターキー押され待ち
printf(Ex"保存中...\n")
rec_stop()'保存
printf(Ex"完了!\n")
exit(0)'終了