ウチツクシ

ゲームをしたり作ったり

リアルタイムにサウンドを生成・再生する

f:id:K-s:20160925193304p:plain
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

Mk-Synth

PCのキーボードを鍵盤代わりに音を鳴らしたり、鳴らした音を録音してwavファイルに出力したりします。

HSPプログラムコンテスト2016 HSPTV部門に応募しました。
HSPTVブラウザで配信 > SoupSeed

2016.12.10: スタンドアロン版(+ソースコード)公開しました。(2017.3.5: URLが間違っていました…)
Download > OneDrive

f:id:K-s:20160904022358p:plain:w240

とどけ蟻 スタンドアロン版(+ソースコード) とaxダイエット

HSPコンテストの季節がやってきた。今年で14年目、長寿なコンテストだなあと思う。作品応募者としては目標ができるし、ユーザーとしてはいろんな作品見られるし、今後もどんどん続いて欲しいな。
で、前回自分が応募したページ見ていてソース公開してなかったのに気づいて、せっかくなんでexeも作って公開しました。以下URLより。
https://1drv.ms/f/s!Ar6lqe2DjQo0gif3iUp0It6oqEC7

久々にスクリプト見て、ちょっとやり忘れ?な部分と memfile+picload で気づいたことを以下書く。

続きを読む

今覚醒めの時 Psyvariar

7月にiOSで配信予定のサイヴァリア新作リアセンブルのキャンペーンでデジタル新録AC版楽曲「Earth (MediumUnit Ver.)」が配信された。


サイヴァリアはゲーセン本格的に行きだした頃にハマったゲームで、Buzzの快感だけでなくBGMのトリップ感に心打たれて連日通い詰めだった。近場のゲーセンは音が小さくてスタッフに大きくしてもらえないかと頼んでみたら少し上げてもらえたけど、周りとの兼ね合いもあるしサイヴァリアやってるの自分くらいしか見たことなかったからあまり無理は言えない…それでちょっと遠くにあるゲーセンで大音量のサイヴァリア発見して興奮したのだった。

トリップ感溢れるBGMに相まって好きなのが出撃シーン。ほんとこれ体感するためにサイヴァリアにコイン入れてるんじゃないかってくらいに気に入ってしまっていた。今なおSTGにおけるマイベスト出撃シーン第一位を飾っている*1

その出撃シーンに流れるBGM「Earth」を聞いて、居ても立ってもいられなくなって深夜にPS2引っ張りだして録画した。

コイン入れる→スタートのテンションさ。周りが静かな中、大音量で聞くとヤバイ。
そこからあの出撃で一気にMAXになるのよ。
あとクリア→エリアセレクトの流れるようなシーケンス、BGMとのシンクロも堪らん…

……

ひとしきり懐古に浸って、リアセンブル。とても楽しみでしかたないんだけど、問題が一つあって。
iOSどうしよう…流石にACに移植ってのは無いよな…

*1:これが出たら一位の座は危なかった