質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

965閲覧

マイクロビットのプログラムで音の長さを変える方法

jake0228

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/04 12:32

マイクロビットで曲を作る教材を作成しております。
その際、音階をプログラムしておき、マイクロビットのAボタンを押すと次の音に行くようにしたいと思っています。
現在は、点数の変数を作成し、Aボタンを押すと点数が1ずつ増えていくプログラムを作り、その点に対応する音が流れるようにしています。
しかし、その場合、条件文が音に応じて作成されてしまい、処理が間に合わなくなってしまいます。
プログラムを簡略化することができないでしょうか。
よろしくお願いいたします。

いかにpythonに変換したプログラムを添付いたします。

def on_button_pressed_a():
game.add_score(1)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
game.set_score(0)
input.on_button_pressed(Button.B, on_button_pressed_b)

game.set_score(0)

def on_forever():
if game.score() == 1:
music.play_tone(294, music.beat(BeatFraction.BREVE))
basic.forever(on_forever)

def on_forever2():
if game.score() == 2:
music.play_tone(392, music.beat(BeatFraction.BREVE))
basic.forever(on_forever2)

def on_forever3():
if game.score() == 3:
music.play_tone(370, music.beat(BeatFraction.BREVE))
basic.forever(on_forever3)

def on_forever4():
if game.score() == 4:
music.play_tone(392, music.beat(BeatFraction.BREVE))
else:
pass
basic.forever(on_forever4)

def on_forever5():
if game.score() == 5:
music.play_tone(440, music.beat(BeatFraction.BREVE))
basic.forever(on_forever5)

def on_forever6():
pass
basic.forever(on_forever6)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リストを使うと条件分岐コードを省き、コードを簡略化できます。

python

1num = 0 2 3FREQ_LIST = [ 4 294, 5 392, 6 370, 7 392, 8 440, 9] 10 11def on_forever(): 12 if len(FREQ_LIST) > num >= 0: 13 freq = FREQ_LIST[num] 14 music.play_tone(freq, music.beat(BeatFraction.BREVE)) 15 basic.show_number(num) 16basic.forever(on_forever) 17 18def on_button_pressed_a(): 19 global num 20 num += 1 21input.on_button_pressed(Button.A, on_button_pressed_a) 22 23def on_button_pressed_b(): 24 global num 25 num = 0 26input.on_button_pressed(Button.B, on_button_pressed_b)

音の長さはbeat を変更することで可能ですが、既に鳴ってる音の長さを変えたい場合、
もし、以前の音を中断し、ボタン押してすぐに音を変更させたいということであれば、
一旦音を止めて(music.rest)、音を鳴らす関数はバックグランド(control.in_background)で実行します。

python

1num = 0 2 3FREQ_LIST = [ 4 294, 5 392, 6 370, 7 392, 8 440, 9] 10 11def play_note(): 12 if len(FREQ_LIST) > num >= 0: 13 freq = FREQ_LIST[num] 14 music.play_tone(freq, music.beat(BeatFraction.BREVE)) 15 basic.show_number(num) 16 17 18def on_button_pressed_a(): 19 global num 20 num += 1 21 music.rest(0) 22 control.in_background(play_note) 23input.on_button_pressed(Button.A, on_button_pressed_a) 24 25def on_button_pressed_b(): 26 global num 27 num = 0 28input.on_button_pressed(Button.B, on_button_pressed_b)

投稿2020/10/04 22:06

編集2020/10/04 23:18
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jake0228

2020/10/04 22:16

ありがとうございます。 詳しい説明をくださり感謝いたします。 if len(freq) > num >= 0: の部分にエラーが生じる現象が起きております。 can't find called function "len" 可能でございましたらご教授いただけますでしょうか。
teamikl

2020/10/04 22:21

取り急ぎ修正 if 5 > num >= 0: で通るはずです。通常のPythonではなかったのですね。 本来なら例外処理が必要なのですが try/except IndexError もエラーになってしまったので、 カウントがリストの数を超えたときのエラー処理は、後で回答のコードを修正します。
teamikl

2020/10/04 22:27

typo でした、if len(freqs) > num >= 0: でどうでしょう。 ※変数名 freqs -> freq 紛らわしいので他の名前に変えたほうが良かったです
teamikl

2020/10/04 22:30

回答コードの変数名を変更しました。
jake0228

2020/10/04 22:32

ありがとうございました。 ご指示通りの修正でエラーが消えました。 少し遅延する(音が途切れる)ことを解消できればと思っております。 リストの数に対応させて利用させていただきます。 ボタンを押した時、音が途切れずに次の音につながればと思っております。 より良い知恵がございましたらご教授いただければと願います。
jake0228

2020/10/04 22:35

ありがとうございます。 修正いただいたコードでエラーが消えました。 ご丁寧にありがとうございました。
teamikl

2020/10/04 23:15

上記コード中の basic.show_number(num) を、 関数の末尾、音を鳴らした後に配置してみてください。 多分ここが一番大きなラグの原因です。 他にラグになりそうな要因は、いくつかピックアップのみすると・・・ (ブラウザでの実行なので実機でどうなるかわかりません) - music.rest(0) にする。 - in_background だとバックグラウンドのスレッド起動がラグになるかもしれない。 - 周波数指定ではなく、forever内でメロディを指定して再生する、等。
jake0228

2020/10/05 21:23

ありがとうございます。 basic.show_number(num) music.rest(0) を削除することで、メモリが不足するエラーが消えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問