HSPでようやくノコギリ波の音を出すことができました…

致命的なミスが見つかったため、とりあえず修正して正弦波を出してみました

HSPでようやくノコギリ波の音を出すことができました…

やっとできた…。HSP製のサンプル全然なくてC言語とかのヤツしかないからすんごい苦労して、やっとノコギリ波 (たぶん) が出せました。(ノコギリ波じゃなかったらごめんなさい。)

// 色々準備
#include "winmm.as"
#define CALLBACK_FUNCTION 0x30000
#define CALLBACK_NULL 0
#define CALLBACK_WINDOW 0x10000
#define WHDR_BEGINLOOP 4
#define WHDR_ENDLOOP 8

// 波形データ作成
waveDataSize=11025*2*3
syuuhasuu=262
sdim waveData,waveDataSize
repeat waveDataSize/2
if (cnt\(11025/syuuhasuu))=0 : data=0 : else : data+
wpoke waveData,cnt,data
loop

// 再生準備
sdim WAVEFORMATEX,18
wpoke WAVEFORMATEX,0,1
wpoke WAVEFORMATEX,2,1
lpoke WAVEFORMATEX,4,11025
lpoke WAVEFORMATEX,8,11025*2
wpoke WAVEFORMATEX,12,2
wpoke WAVEFORMATEX,14,16

sdim WAVEHDR,32
lpoke WAVEHDR,0,varptr(wavedata)
lpoke WAVEHDR,4,wavedatasize
lpoke WAVEHDR,16,WHDR_BEGINLOOP | WHDR_ENDLOOP
lpoke WAVEHDR,20,1

waveOutOpen varptr(phwo),-1,varptr(WAVEFORMATEX),0,0,CALLBACK_NULL
waveOutPrepareHeader phwo,varptr(WAVEHDR),32
waveOutWrite phwo,varptr(WAVEHDR),32
wait 500
waveOutReset phwo
waveOutUnprepareHeader phwo,varptr(WAVEHDR),32
waveOutClose phwo

上から下まで作るのに苦労しました。waveOut~の使い方もわからなかったし波形データの作り方もわからなかったから作るのにすんごい時間がかかった…。
ちなみにこれで出る音はノコギリ波で、ドレミファソラシドの「ド」です。(たぶんあってると思う。)

- 補足 -

たぶん上のソース間違ってるんでこっちで…。すいません。

// 色々準備
#include "winmm.as"
#define CALLBACK_FUNCTION 0x30000
#define CALLBACK_NULL 0
#define CALLBACK_WINDOW 0x10000
#define WHDR_BEGINLOOP 4
#define WHDR_ENDLOOP 8

onexit *exit

// 波形データ作成
// -32768~32767
waveDataSize=22100*2*8
syuuhasuu=262,294,330,349,392,440,494,523
sdim waveData,waveDataSize
repeat waveDataSize/2
if (cnt\(22100/syuuhasuu(oto)))=0 : data=-100 : else : data+
wpoke waveData,cnt,data
if (cnt\22100)=22099 : oto+
loop

// 再生準備
sdim WAVEFORMATEX,18
wpoke WAVEFORMATEX,0,1
wpoke WAVEFORMATEX,2,1
lpoke WAVEFORMATEX,4,11025
lpoke WAVEFORMATEX,8,22100
wpoke WAVEFORMATEX,12,2
wpoke WAVEFORMATEX,14,16

sdim WAVEHDR,32
lpoke WAVEHDR,0,varptr(wavedata)
lpoke WAVEHDR,4,wavedatasize
lpoke WAVEHDR,16,WHDR_BEGINLOOP | WHDR_ENDLOOP
lpoke WAVEHDR,20,1

waveOutOpen varptr(phwo),-1,varptr(WAVEFORMATEX),0,0,CALLBACK_NULL
waveOutPrepareHeader phwo,varptr(WAVEHDR),32
waveOutWrite phwo,varptr(WAVEHDR),32
stop
*exit
waveOutReset phwo
waveOutUnprepareHeader phwo,varptr(WAVEHDR),32
waveOutClose phwo
end

他にも改良したところあるので使うならこっちで。すいません。


「HSPでようやくノコギリ波の音を出すことができました…」への5件のフィードバック

  1. おおっ、すごいです!
    ノゴキリ波っぽい音ですね^^ 正しいと思います。
    ファミコン風のゲームを作るときなどに活用できるかも……

  2. 波形データさえ作れればファミコンのような音やFM音源のようなのとか出せると思います。たぶん。
    でも、私はその前に正弦波とか基本のがまだ作れていないので…頑張ろうと思います…。
    たぶんノコギリは出せているものの、これだと音程変えると音量まで変化してしまう (一定の期間どんどん音量 (?) を上げて、ある時下げる、とやっているため) ので、ようやく音に出せるようになったので今度は波形データの作成を頑張ろうと思います。

  3. おめでとうございます!
    波とかよくわかりませんが、なんかすごいですね。
    再生したところ、「おお、これがノコギリ波か。」みたいなww
    これから頑張ってください。

  4. はい。
    …と、頑張ろうと思った矢先にすんごいひどいミスを見つけてしまいました… orz
    波形データを作成するところで2バイトづつ書き込んでいるのに1バイトづつの所に書き込んでいるという…。なので半分の時間しか音が出ない…。
    今度直します。すいません。

  5. あ、お礼を書き忘れていた!すいません。
    サイトとかの紹介、ありがとうございました。

コメントは受け付けていません。