【HSP】正弦波の音を出す【モジュール】
【HSP】正弦波の音を出す【モジュール】
#ifndef _WAVEOUT_H_
#define _WAVEOUT_H_#include "winmm.as"
#module _WAVEOUT_M_
//
// モジュール初期化
//
#deffunc local init// WAVEFORMATEX 構造体
wBytesPerSample = 2 // 量子化バイト数wFormatTag = 0x0001 // WAVE_FORMAT_PCM
nChannels = 2 // ステレオ
nSamplesPerSec = 44100 // サンプルレート
wBitsPerSample = wBytesPerSample * 8
nBlockAlign = nChannels * wBytesPerSample
nAvgBytesPerSec = nSamplesPerSec * nBlockAlign
cbSize = 0wfex = wFormatTag | (nChannels << 16), nSamplesPerSec, nAvgBytesPerSec, nBlockAlign | (wBitsPerSample << 16), cbSize
// オープン
hWaveOut = 0
waveOutOpen varptr(hWaveOut), -1, varptr(wfex), 0, 0, 0 // WAVE_MAPPER, CALLBACK_NULLreturn
//
// モジュール終了処理
//
#deffunc exit onexit// クローズ
waveOutReset hWaveOut
waveOutUnprepareHeader hWaveOut, varptr(whdr), 32 // sizeof(WAVEHDR)
waveOutClose hWaveOutreturn
//
// wave 出力
//
// _wave : 波形データの入った変数
// _nAvgBytes : 波形データのバイト数
//
#deffunc waveOut var _wave, int _nAvgBytes// WAVEHDR 構造体
lpData = varptr(_wave)
dwBufferLength = _nAvgBytes
dwBytesRecorded = 0
dwUser = 0
dwFlags = 12 // WHDR_BEGINLOOP | WHDR_ENDLOOP
dwLoops = 1 // ループ回数
lpNext = 0
reserved = 0whdr = lpData, dwBufferLength, dwBytesRecorded, dwUser, dwFlags, dwLoops, lpNext, reserved
// 再生
waveOutReset hWaveOut
waveOutPrepareHeader hWaveOut, varptr(whdr), 32 // sizeof(WAVEHDR)
waveOutWrite hWaveOut, varptr(whdr), 32 // sizeof(WAVEHDR)return
//
// サイン波出力
//
// f : 周波数 (ヘルツ単位)
// a : 振幅 (0.0 ~ 1.0)
// t : 時間 (秒単位)
//
#deffunc waveOutSine double f, double a, double t// 波形データ
nSamples = int(t * nSamplesPerSec) // 全体のサンプル数
nAvgBytes = nSamples * nBlockAlign // 全体のバイト数dim wave, (nAvgBytes + 3) / 4
repeat nSamples
// この部分は nChannels や wBytesPerSample によって書き換えが必要
wpoke wave, cnt * 4 , int(sin(2.0 * M_PI * f * cnt / nSamplesPerSec) * 0x7FFF * a) & 0xFFFF
wpoke wave, cnt * 4 + 2, int(sin(2.0 * M_PI * f * cnt / nSamplesPerSec) * 0x7FFF * a) & 0xFFFF
loop// 再生
waveOut wave, nAvgBytesreturn
#global
init@_WAVEOUT_M_
#endif
#include "hspmath.as"
#define NOTE_DIFF 1.05946309436
//
// メイン
//melody = -9, -7, -5, -4, -2, 0, 2
repeat
waveOutSine 440.0 * pow(NOTE_DIFF, melody(cnt \ 7) + (cnt / 7 \ 4 - 1) * 12), 0.25, 0.5
await 500
loop