スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

HSPで自前で波形を作製し、音を出す。

音を出すだけ。

波形データは-32768~32767の16bit(2byte)データ。HSP上では符号ありっていうのが特にややこしいような気がします。
と思ったけれども、0xFFFFでand演算するだけで符号の問題も簡単に解決できる模様。

このプログラムで記述した波形データは0.25秒。wfex.2 (WAVEFORMATEXのnSamplesPerSec)の1秒間のサンプル数が11025であり、波形データdataは11025/2byte用意されている。1サンプルに2byte必要なので、この波形データは11025/4サンプル数。0.25秒。

具体的な周波数の音が欲しいならば、例えば440Hzのサイン波を生成する場合、1秒間のサンプル数が11025であることに注意して、
sin(M_PI*2*cnt*440/11025)*振幅
となる。(精度を高めるため、割り算を後に行っている。)



#uselib "WINMM.DLL"
#func waveOutOpen "waveOutOpen" sptr,sptr,sptr,sptr,sptr,sptr
#func waveOutPrepareHeader "waveOutPrepareHeader" sptr,sptr,sptr
#func waveOutWrite "waveOutWrite" sptr,sptr,sptr

hwo=0 // オープンしているウェーブフォームオーディオ出力デバイスを
// 識別するハンドル
dim wfex,4 // デバイスに送信されるウェーブフォームオーディオデータの形式を
// 識別する WAVEFORMATEX 構造体 WORDx5+DWORDx2

wfex = 0x00010001,11025,22050,0x00100002
// wFormatTag=1;nCannels=1;nSamplesPerSec=11025;nAvgBytesPerSec=22050;
// nBlockAlign=0x0010;wBitsPerSample=2;cbSize=0;

// オーディオ出力デバイスの準備
waveOutOpen varptr(hwo),-1,varptr(wfex),0,0,0
if stat : mes "err:waveOutOpen" : stop

// 波形
sdim data,11025/2
repeat 11025/4
wpoke data,cnt*2,(0+sin(0.1*cnt)*0x7FFF)&0xFFFF
loop

// データの初期化
dim whdr,8 // WAVEHDR DWORDx8
whdr.0=varptr(data)
whdr.1=11025/2;strlen(data)
waveOutPrepareHeader hwo,varptr(whdr),32

// 発音
waveOutWrite hwo,varptr(whdr), 32




オマケ

440Hz = 「ラ」
880Hz = 440*2 = 1オクターブ↑の「ラ」
1760Hz = 440*2*2 = 2オクターブ↑の「ラ」

nオクターブ上がる → 周波数は(2のn乗)倍になる。
半音上がる → 周波数は(2の1/12乗)倍になる。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : HSP3 音声制御

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
995位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
199位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。