なんとなく作ってみた、ちょっと大きい無駄なスクリプト
#include "hspogg.as"
#module ControlWaveDTMF
/****************************************************
モジュール内部用です。
ファイルのヘッダーを作成します。
****************************************************/
#deffunc CreateWaveHeader var WaveDataFile
dim RIFFHeader,4
RIFFHeader(0) = 0x46464952 //識別'RIFF'
RIFFHeader(1) = 12
RIFFHeader(2) = 0x45564157 //識別'WAVE'
//必要な情報
FH_format = 1 //フォーマット
FH_Channels = 1 //チャンネル数
FH_SamplingRate = 44100 //サンプリング周波数(Hz)
FH_BitsPerSample = 16 //1サンプルのBit数
FH_BytesPerSample = FH_BitsPerSample / 8 //1サンプルのByte数
//下記は上記の必要な情報を元に計算
dim FileHeader,8
FileHeader(0) = 0x20746D66 //識別チャンク名 'fmt '
FileHeader(1) = 16 //サイズ (id と size を含めないヘッダーのサイズ)
FileHeader(2) = FH_format //フォーマット[format]
FileHeader(2) += FH_Channels << 16 //使用チャンネル数[Channels]
FileHeader(3) = FH_SamplingRate //サンプリング周波数(Hz)[SamplingRate]
FileHeader(4) = FH_SamplingRate * FH_BytesPerSample * FH_Channels //レート
FileHeader(5) = FH_BitsPerSample / 8 * FH_Channels //データブロックサイズ
FileHeader(5) += FH_BitsPerSample << 16 //1 サンプルあたりのビット数
dim DataHeader,4
DataHeader(0) = 0x61746164 //識別チャンク 'data'
memcpy WaveDataFile,RIFFHeader,12,0
memcpy WaveDataFile,FileHeader,24,12
memcpy WaveDataFile,DataHeader,8,36
return
/*********************************************************************
モジュール内部用です。
波形データ部分を作成します。
*********************************************************************/
#deffunc CreateWaveData var WaveDataFile,int HzValue,int Time
SizeOfSample = FH_SamplingRate * Time
SizeOfBuffer = SizeOfSample * (FH_BitsPerSample / 8) * FH_Channels
//data チャンクヘッダーに確定情報を書き込む
DataHeader(1) = SizeOfBuffer
memcpy WaveDataFile,DataHeader,8,36
//波形データを作成
Frequency = double(HzValue)
Amplification = 0.6
Duration = double(Time)
repeat SizeOfSample
val = Amplification * sin(2.0 * M_PI * double(cnt) * Frequency / FH_SamplingRate)
val_p = val * 32767.0
wpoke WaveDataFile,44 + (cnt * 2),int(val_p)
loop
return SizeOfBuffer
/*********************************************************************
CreateWaveMemory p1,p2,p3
p1 : 作成したデータを格納するバッファ
p2 : 作成するHz値(数値)
p3 : 作成する長さ(秒単位)
この部分でファイル全体を作っています。
*********************************************************************/
#deffunc CreateWaveMemory var WaveDataFile,int HzValue,int Time
FileEndPoint = 0
CreateWaveHeader WaveDataFile
FileEndPoint += 44
CreateWaveData WaveDataFile,HzValue,Time
FileEndPoint += stat
//ファイルサイズ確定情報を入れる
SizeOfFile = SizeOfBuffer + 44 - 8
RIFFHeader(1) = SizeOfFile
memcpy WaveDataFile,RIFFHeader,12,0
return FileEndPoint
#global
mes "wave ファイルの作成開始"
sdim WaveFileTemp,1250304
CreateWaveMemory WaveFileTemp,697,1
CreateFileSize = stat
dim HzData,8
HzData(0) = 697,770,852,941,1209,1336,1477,1633
sdim WaveFile,CreateFileSize,12
repeat 8
CreateWaveMemory WaveFile(cnt),HzData(cnt),1
FileName = strf("DTMF_%d.wav",HzData(cnt))
bsave FileName,WaveFile(cnt),CreateFileSize
loop
mes "ファイル作成完了"
mes "ファイルの読み込み開始"
dmmini
repeat 8
FileName = strf("DTMF_%d.wav",HzData(cnt))
dmmload FileName,cnt
loop
mes "ファイルの読み込み完了"
//音声ファイルの組み合わせを作る(0〜9 と * #)
dim SoundCombi,2,12
SoundCombi(0,0) = 3,5 //0
SoundCombi(0,1) = 0,4 //1
SoundCombi(0,2) = 0,5 //2
SoundCombi(0,3) = 0,6 //3
SoundCombi(0,4) = 1,4 //4
SoundCombi(0,5) = 1,5 //5
SoundCombi(0,6) = 1,6 //6
SoundCombi(0,7) = 2,4 //7
SoundCombi(0,8) = 2,5 //8
SoundCombi(0,9) = 2,6 //9
SoundCombi(0,10) = 3,4 //*
SoundCombi(0,11) = 3,6 //#
*main
mes "DTMF 再生開始"
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 6 : SoundBreak = 300 : gosub *SoundControl : await 400
SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 400
await 500
SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 6 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 9 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 11 : SoundBreak = 300 : gosub *SoundControl : await 400
SoundPlay = 9 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 6 : SoundBreak = 200 : gosub *SoundControl : await 400
SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400
await 500
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700
SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700
await 200
SoundPlay = 1 : SoundBreak = 100 : gosub *SoundControl : await 100
SoundPlay = 1 : SoundBreak = 100 : gosub *SoundControl : await 200
SoundPlay = 2 : SoundBreak = 100 : gosub *SoundControl : await 100
SoundPlay = 2 : SoundBreak = 100 : gosub *SoundControl : await 200
SoundPlay = 3 : SoundBreak = 100 : gosub *SoundControl : await 100
SoundPlay = 3 : SoundBreak = 100 : gosub *SoundControl : await 200
SoundPlay = 6 : SoundBreak = 100 : gosub *SoundControl : await 100
SoundPlay = 6 : SoundBreak = 100 : gosub *SoundControl : await 200
SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 300
SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 300
SoundPlay = 1 : SoundBreak = 300 : gosub *SoundControl : await 300
mes "DTMF 再生終了"
stop
*SoundControl
dmmplay SoundCombi(0,SoundPlay),0
dmmplay SoundCombi(1,SoundPlay),0
await SoundBreak
dmmstop -1
return