マリオのように、曲のチャンネルを借りるジャンプの音
ジャンプのレッスンの四角に、ここで作った八つの音のめぐる曲とジャンプの音を足した。音を出して遊ぶと、曲がわきへ退くのが聞こえる。プログラムは 616 バイトの命令 267 個で、作り方も確かめ方も同じだ。
ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: sound.nes
画面の上では
二つの音に、チャンネルは一つ
コンソールには矩形波のチャンネルが二つ、三角波、ノイズ、サンプル用のチャンネルが一つずつあり、ゲームの音はそれより多い。スーパーマリオブラザーズは曲の一部を一つ目の矩形波チャンネルで鳴らし、マリオが跳ぶとジャンプの音がそのチャンネルを取る: 音の高さを滑らせる仕組みを入れた設定がそこに書かれ、曲は後の音になるまでそのチャンネルに書かない。このカートリッジも同じようにチャンネルを分け合う。ジャンプの音がチャンネルを持っている間も曲は数え続けるので、次の音で拍に合って戻ってくる。ゲームから取ったのはこの分け合い方だけで、どちらの音が何を鳴らすかは比べない。音は誰かが作ったものだからだ。
| このカートリッジ | スーパーマリオブラザーズ | |
|---|---|---|
| ジャンプの前の 60 フレームに、一つ目の矩形波チャンネルへ書いた数 | 16 | 136 |
| A からジャンプの音までのフレーム数 | 0 | 1 |
| 高さを滑らせる仕組みを入れて書いた設定の数と、そのフレーム | 1 (0 フレーム目) | 3 (0, 3, 8 フレーム目) |
| 曲がチャンネルに再び書くまでのフレーム数 | 12 | 39 |
書いたとおりに
このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: sound.s
;; The jump sound: the first square channel, a half-and-half wave whose
;; loudness falls away by itself, the pitch sweep on and rising, from a
;; low note. It holds the channel for 10 frames.
jumpsound:
LDA #$84
STA $4000
LDA #$9B
STA $4001
LDA #$90
STA $4002
LDA #$11
STA $4003
LDA #$0A
STA $52
RTS
;; The tune: a note every 16 frames, round the eight. While the jump
;; sound holds the channel the tune only counts; it writes again at its
;; next note after the jump sound has let go.
tune:
LDA $52
BEQ free
DEC $52
free:
DEC $51
BPL held
LDA #$0F
STA $51
LDX $50
INX
TXA
AND #$07
STA $50
LDA $52
BNE held
LDX $50
LDA #$B6
STA $4000
LDA #$08
STA $4001
LDA notelow,X
STA $4002
LDA notehigh,X
STA $4003
held:
RTS