素人の漫画机

素人が漫画を描くとはこういうことさ。

【Pyxel】音楽を鳴らしてみるぞ!

久しぶりにPyxelを触って何をしたかと思えば音楽を鳴らしてみただけなのでした。

…のはいいんだけど、自宅のその辺にあった合唱曲の楽譜を使ったので若干不安。

一応問題はないはず。。。

※画面内クリックで再生開始/停止、停止中画面上部の文字をクリックで再生位置リセット※

 

以下プログラミングの中身をちょこっと

↓ これは音楽の前奏部分の1パートをpythonコードにおこしたもの ↓

        pyxel.sound(0).set(
          "RR G3G3 F3F3 B-2B-2 G3G3 A-3A-3 G3G3 F3F3 E-2E-2 C3C3 B-2B-2", # 前奏
          "SS SS SS SS SS SS SS SS SS SS SS", # すべてSquareの音色
          "00 55 55 55 55 55 55 55 44 44 33", # 音量0~7
          "NN NN NN NN NN NN NN NN NN NN NN", # 長いところはVibratoエフェクト
          self.musicspeed
        )

Pyxelではサウンドクラスを使用して音を鳴らす。

 

サウンドクラスはデフォルトで64個くらいオブジェクトが作成されるので、pyxel.sound(0)を使って0番目(プログラミングは0始まりなのだ!)のオブジェクトに音情報をセッティングする。

 

最初の文字列は音程の情報をあらわしている。(ドレミファソラシをCDEFGABで読み替えるぞ!英語圏式だ!多分)

アルファベットの横の数字は音の高さを表す(ドレミファソラシドはC1→D1→E1→F1→G1→A1→B1→C2になるぞ!)

アルファベットと数字の間にあるハイフンは♭(音を半音下げる)、そしてRは休符を表している。(書かれてはいないが音を半音上げる#もあるぞ!)

 

ここに書いた音が順番に鳴らされる。

 

鳴らす音の長さは末尾にあるself.musicspeedの数値で決まっており、数値が120だとC1の一文字で1秒間ドの音が鳴らされる。

数値が30だと1/4の0.25秒鳴らされる。

 

「C1C1」のように同じ音を連続して書いた場合は「ドド」ではなく「ドー」とつながって音が鳴る。

「C1 C1」のように間にスペースを入れても無視される。

「ドド」と鳴らしたい場合は、休符をはさんで無理やり区切るか、別のチャンネルを使って鳴らすしかなさそう。

 

音色、音量、エフェクトの3つは、1つの音に対して1文字設定するので、上記のコードのように音が22個あれば22文字書ける。

が、音の数より文字数が少ない場合は、先頭に戻ってループする

          "C1 D1 E1 F1 E1 D1 C1", # 前奏
          "S S T", # Square→Square→Triangleの音色

↑ みたいな場合は、C1にS → D1にS → E1にT → F1にS → E1にS → D1にT → C1にS、という風に適用される。

 

パート譜が完成したらミュージッククラスのチャンネルにパート譜を登録する。

        # ミュージックセット
        pyxel.music(0).set(
          [0],
          [1],
          [2],
          [3]
        )

↑ は4つのチャネルにサウンドクラスの0番目、1番目、2番目、3番目のオブジェクトを登録している。(一つのチャンネルに複数のサウンドクラスオブジェクトを登録することも可能、登録した順番に再生されるっぽい)

 

 

まぁ詳しい話は公式のGitHubに記載されているので、備忘録的にここまで。。。