リアルタイムにサウンドを生成・再生する
Mk-Synth、サウンドの再生にwaveOut系のAPIを使っているのだけど、スクリプトがHSPTV部門用に詰めてて自分でも分かりにくいので、再生部分だけでも分かりやすくなるようにサンプル書いた。
実行するといきなり音が鳴るので音量注意!マウス左ボタンで波形の形を変えれる。
; HSP3.5b4 #include "winmm.as" ; 基になる波形の準備 bwsize = 100 ; 一周期の長さ ddim bwbuf, bwsize repeat bwsize if (cnt < bwsize / 2) { bwbuf(cnt) = 0.2 } else { bwbuf(cnt) = -0.2 } loop bwpos = 0 boxsize = 3 asprate = 0.5 winsx = bwsize * boxsize winsy = asprate * winsx screen 0, winsx, winsy gosub *drawBaseWave channels = 1 bits = 16 samples = 44100 blockalign = channels * bits / 8 wbufnum = 5 wbufblock = 1000 wbufsize = wbufblock * blockalign ; 小さい程反応が早いが音が途切れやすい dim wfx, 4 ; WAVEFORMATEX wfx(0) = 1 | (channels << 16) ; WAVE_FORMAT_PCM wfx(1) = samples wfx(2) = samples * blockalign wfx(3) = blockalign | (bits << 16) ; デバイス オープン dim hwo waveOutOpen varptr(hwo), $ffffffff, varptr(wfx), 0, 0, 0 ; WAVE_MAPPER if stat { dialog "デバイスのオープンに失敗しました" end } ; マルチバッファリング用のバッファ準備 sdim wavBuf, wbufsize * wbufnum dim whd, 8, wbufnum ; WAVEHDR ptwhd = varptr(whd) repeat wbufnum whd(0, cnt) = varptr(wavBuf) + wbufsize * cnt, wbufsize pt = ptwhd + cnt * 32 waveOutPrepareHeader hwo, pt, 32 waveOutWrite hwo, pt, 32 loop nowbuf = 0 onexit goto *bye *mainLoop await 1 stick key, 256 if (key & 256) { ; マウス左ボタン bwbuf(mousex / boxsize) = double((mousey - winsy / 2) / boxsize) * boxsize / winsy * 2 gosub *drawBaseWave } if (whd(4, nowbuf) & 1) { ; WHDR_DONE(1): バッファの再生が終了している gosub *writeWave } goto *mainLoop *drawBaseWave redraw 0 color 255, 255, 255 boxf color 0, 0, 0 repeat bwsize x = cnt * boxsize y = (bwbuf(cnt) + 1) / 2 * winsy boxf x, y, x + boxsize - 1, y + boxsize - 1 loop redraw 1 return *writeWave p = nowbuf * wbufsize repeat wbufblock wpoke wavBuf, cnt * 2 + p, int(bwbuf(bwpos) * $7fff) bwpos = (bwpos + 1) \ bwsize loop waveOutWrite hwo, ptwhd + nowbuf * 32, 32 nowbuf = (nowbuf + 1) \ wbufnum return *bye waveOutReset hwo repeat wbufnum waveOutUnprepareHeader hwo, ptwhd + cnt * 32, 32 loop waveOutClose hwo end end
サウンドのバッファを複数用意しておいて再生が終わったバッファに波形を書くの繰り返し。再生が終わったのを知るのは oncmd で MM_WOM_DONE を受け取る方法もある(こっちが普通?)けど、今回は WAVEHDR構造体 の dwFlags をループでチェックしてる。
波形の作り方で色々音が変わるのが結構楽しい。キーマニ専コンで弾きたかった(Win10に更新したら動かなくなった…
ゲーセン近況
クリクロようやっと5ボス撃破できた!1面で2ミスして諦め全開だったのに何故かそのまま5ボス発狂まで行けて、しかも残一という初記録。ブレイク、ボムぶっ放しで撃破しましたよ。それに発狂の動きもだいぶ分かってきたのもある。バウンドの大小があって大きい時に抜ける感じ。初めはコレ絶対無理って思ってたけど、なんとかなるもんだ。
撃破してよっしゃクリアー!!とはいかないわけで。やっぱりいたよ、二体目が…接近してきてビーム撃ってくる攻撃で終わった。こいつ開幕から嫌らしいバラマキやってくるな。というかこのゲーム全般的になんか弾避けづらい気が…(言い訳
ボチボチ三年以上経つけどクリアはまだ遠そう。まだあのボスもう一回くらい変形隠してそうだし。あとちょっと気分転換に一号機と三号機でもやってみたけど、ロックが遅くて自機スピードが速い三号機が結構辛かった。一号機は二号機とあまり変わらない感じ。どっちも一応5ボスまでは行けた。Z機は、後で出てきた機体だから他のでクリア出来たら使ってみようかな。クリアできるか分からんがw
とどけ蟻 スタンドアロン版(+ソースコード) とaxダイエット
HSPコンテストの季節がやってきた。今年で14年目、長寿なコンテストだなあと思う。作品応募者としては目標ができるし、ユーザーとしてはいろんな作品見られるし、今後もどんどん続いて欲しいな。
で、前回自分が応募したページ見ていてソース公開してなかったのに気づいて、せっかくなんでexeも作って公開しました。以下URLより。
https://1drv.ms/f/s!Ar6lqe2DjQo0gif3iUp0It6oqEC7
久々にスクリプト見て、ちょっとやり忘れ?な部分と memfile+picload で気づいたことを以下書く。
続きを読む今覚醒めの時 Psyvariar
7月にiOSで配信予定のサイヴァリア新作リアセンブルのキャンペーンでデジタル新録AC版楽曲「Earth (MediumUnit Ver.)」が配信された。
【デジタル新録アーケード版サイヴァリア楽曲配信】 第2弾はアンケートの結果「Earth (MediumUnit Ver.)」 です!事前登録してから曲をダウンロードして、次週の曲をリクエスト!(既に事前登録されてる方もどうぞ!)→ https://t.co/LZNFwoaYJ1
— Psyvariar (@PsyvariarRA) 2016年6月24日
サイヴァリアはゲーセン本格的に行きだした頃にハマったゲームで、Buzzの快感だけでなくBGMのトリップ感に心打たれて連日通い詰めだった。近場のゲーセンは音が小さくてスタッフに大きくしてもらえないかと頼んでみたら少し上げてもらえたけど、周りとの兼ね合いもあるしサイヴァリアやってるの自分くらいしか見たことなかったからあまり無理は言えない…それでちょっと遠くにあるゲーセンで大音量のサイヴァリア発見して興奮したのだった。
トリップ感溢れるBGMに相まって好きなのが出撃シーン。ほんとこれ体感するためにサイヴァリアにコイン入れてるんじゃないかってくらいに気に入ってしまっていた。今なおSTGにおけるマイベスト出撃シーン第一位を飾っている*1。
その出撃シーンに流れるBGM「Earth」を聞いて、居ても立ってもいられなくなって深夜にPS2引っ張りだして録画した。
コイン入れる→スタートのテンションさ。周りが静かな中、大音量で聞くとヤバイ。
そこからあの出撃で一気にMAXになるのよ。
あとクリア→エリアセレクトの流れるようなシーケンス、BGMとのシンクロも堪らん…
……
ひとしきり懐古に浸って、リアセンブル。とても楽しみでしかたないんだけど、問題が一つあって。
iOSどうしよう…流石にACに移植ってのは無いよな…