録音する

録音する方法

録音する方法には、DirectSound、WaveIn○○関数、MCI等があります。
DirectSoundを現在のABで使うには難があります。
WaveIn○○関数を使う方法は、かなり細かい作業ができますが、そのかわり面倒です。
簡単な録音方法としてMCIを使います。

MCIを使う

MCI(MediaControlInterface)はWindowsの音声、動画などメディアを操るAPIです。
単純な録音、再生ならMCIで十分です。再生できるファイルはWINDOWSフォルダにあるWIN.INIに書かれています。
MCIを使うために必要な関数はmciSendCommand関数1つだけです。
この関数を使ってデバイスにメッセージを送ります。
再生の手順は以下のようになります。
MCI_OPENでデバイスを開き
  ↓
MCI_PLAYで再生開始。
  ↓
MCI_STOPで停止。
  ↓
MCI_CLOSEでデバイスを閉じる。

録音なら
MCI_OPENでデバイスを開き
  ↓
MCI_RECで録音開始。
  ↓
MCI_STOPで停止。
  ↓
MCI_SAVEでファイルに保存。
  ↓
MCI_CLOSEでデバイスを閉じる。

録音するプログラム

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)'終了