やってみる

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

pyxelのAPIでSoundをつなげて鳴らす

 1つのチャンネル内で複数のサウンドをつなげて鳴らす。

成果物

コード

#!/usr/bin/env python3
# coding: utf8
import pyxel
class App:
    def __init__(self):
        pyxel.init(96, 54, caption="Sound API. Multi sounds.")
        self.__set_sounds()
        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.sounds, loop=True)
        self.is_play = True
    def __stop(self):
        pyxel.stop()
        self.is_play = False
    def __set_sounds(self):
        self.ch1 = 0
        self.sounds = [0, 1]
        self.__set_sound00()
        self.__set_sound01()
    def __set_sound00(self): # Diatonic C Major
        self.__set_sound(0, "c2d2e2f2g2a2b2c3")
    def __set_sound01(self): # Diatonic D Major
        self.__set_sound(1, "d2e2f#2g2a2b2c#3d3")
    def __set_sound(self, snd, notes):
        tones = "p"
        volumes = "6"
        effects = "n"
        speed = 30
        pyxel.sound(snd).set(
            notes,
            tones,
            volumes ,
            effects ,
            speed,
        )
        
App()

要点

 サウンドIDの配列をplay()に渡す。複数のサウンドをつなげて再生できる。

self.sounds = [0, 1]
pyxel.play(self.ch1, self.sounds, loop=True)

 もちろん事前に各サウンドID0,1にあたるサウンドデータをset()すること。

前回まで

参考

対象環境

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