NEStinymachines

マリオのように、曲のチャンネルを借りるジャンプの音

ジャンプのレッスンの四角に、ここで作った八つの音のめぐる曲とジャンプの音を足した。音を出して遊ぶと、曲がわきへ退くのが聞こえる。プログラムは 616 バイトの命令 267 個で、作り方も確かめ方も同じだ。

ここで遊ぶ カートリッジ。NES のカートリッジを遊べるところならどこでも遊べる: sound.nes

画面の上では

フレーム 100
フレーム 100
フレーム 155
フレーム 155
フレーム 165
フレーム 165
フレーム 200
フレーム 200

二つの音に、チャンネルは一つ

コンソールには矩形波のチャンネルが二つ、三角波、ノイズ、サンプル用のチャンネルが一つずつあり、ゲームの音はそれより多い。スーパーマリオブラザーズは曲の一部を一つ目の矩形波チャンネルで鳴らし、マリオが跳ぶとジャンプの音がそのチャンネルを取る: 音の高さを滑らせる仕組みを入れた設定がそこに書かれ、曲は後の音になるまでそのチャンネルに書かない。このカートリッジも同じようにチャンネルを分け合う。ジャンプの音がチャンネルを持っている間も曲は数え続けるので、次の音で拍に合って戻ってくる。ゲームから取ったのはこの分け合い方だけで、どちらの音が何を鳴らすかは比べない。音は誰かが作ったものだからだ。

このカートリッジスーパーマリオブラザーズ
ジャンプの前の 60 フレームに、一つ目の矩形波チャンネルへ書いた数16136
A からジャンプの音までのフレーム数01
高さを滑らせる仕組みを入れて書いた設定の数と、そのフレーム1 (0 フレーム目)3 (0, 3, 8 フレーム目)
曲がチャンネルに再び書くまでのフレーム数1239

書いたとおりに

このレッスンが扱うプログラムの部分。プログラム全体は、ただのテキストファイルだ: 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

すべてのレッスン