やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

pyxelのAPIで音を鳴らす

 ドレミファソラシド。

成果物

 スペースキーで再生/停止を切替できる。

コード

import pyxel

class App:
    def __init__(self):
        pyxel.init(96, 54, caption="Sound API")
        self.__set_sound()
        self.__play()
        pyxel.run(self.update, self.draw)
    def update(self):
        if pyxel.btnp(pyxel.KEY_SPACE):
            if self.is_play: self.__stop()
            else: self.__play()
    def draw(self):
        pyxel.cls(0)
        pyxel.text(0, 0, 'Please SPACE key: ' + ('PLAY' if self.is_play else 'STOP'), 7)
    def __play(self):
        pyxel.play(self.ch1, [self.sound00], loop=True)
        self.is_play = True
    def __stop(self):
        pyxel.stop()
        self.is_play = False
    def __set_sound(self):
        self.ch1 = 0
        self.sound00 = 0
        self.notes = "c2d2e2f2g2a2b2c3"
        self.tones = "p"
        self.volumes = "6"
        self.effects = "n"
        self.speed = 30
        pyxel.sound(self.sound00).set(
            self.notes,
            self.tones,
            self.volumes ,
            self.effects ,
            self.speed,
        )
        
App()

 c2d2e2f2g2a2b2c3がドレミファソラシド。

要点

  • play / stop
    • ch: 03
      • sound: 063
        • note
        • tone
        • volume
        • effect
        • speed

 上記のような構造になっている。

 あとはAPIを把握すればOK。

オーディオAPI

sound(snd, [system])

サウンドsnd(0-63) を操作する (サウンドクラスを参照のこと)。systemにTrueを指定すると、システム用のサウンド64にアクセスできる

play(ch, snd, loop=False)

チャンネルch(0-3) でサウンドsnd(0-63) を再生する。sndがリストの場合順に再生する

stop([ch])

全チャンネルのサウンドの再生を停止する。ch(0-3) を指定すると該当チャンネルのみを停止する

サウンド class

set

set(note, tone, volume, effect, speed)

文字列で音程、音色、音量、エフェクトを設定する。音色、音量、エフェクトの長さが音程より短い場合は、先頭から繰り返される

set_note

set_note(note)

'CDEFGAB'+'#-'+'0123'または'R'の文字列で音程を設定する。大文字と小文字を区別せず、空白は無視される

  • 音階: CDEFGAB=ドレミファソラシ, #=(半音↑), -=(半音↓)
  • オクターブ: 03
  • 休符: R
pyxel.sound(0).set_note("G2B-2D3R RF3F3F3")

 最大48 note。

1 小節 = 8 note
1 sound = 6 小節 = 6 * 8 = 48 note

set_tone

set_tone(tone)

'TSPN'の文字列で音色を設定する。大文字と小文字を区別せず、空白は無視される

pyxel.sound(0).set_tone("TTSS PPPN")

set_volume

set_volume(volume)

'01234567'の文字列で音量を設定する。大文字と小文字を区別せず、空白は無視される

pyxel.sound(0).set_volume("7777 7531")

set_effect

set_effect(effect)

'NSVF'の文字列でエフェクトを設定する。大文字と小文字を区別せず、空白は無視される

pyxel.sound(0).set_effect("NFNF NVVS")

所感

 音が出た。ゲームでは音って大事。これでクオリティに雲泥の差が出る。

前回まで

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux