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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1708閲覧

Python でシャトルランプログラムを作りたい!

pimen

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/09/10 14:58

前提

pythonにてシャトルランプログラムを作っている途中です。

実現したいこと

実際のシャトルランの音源は大体20分までなのですが、pythonでもっと長い時間まであるシャトルランの音源を作りたいです。

beep音を頑張って重ねるか、playsoundか何かしらでwavを流すかで迷っています。
そもそもBeep音はpythonで重ねられますか?また、pythonで流すwavファイルは音程そのままで倍速にできたりするのでしょうか?

発生している問題・エラーメッセージ

現在python標準搭載のbeep音を使っているのですがシャトルランのレベルアップ時のちゃららん という音楽を流すときに音を重ねられずテンポがずれます。

該当のソースコード

Python

1import winsound 2import time 3from fractions import Fraction 4 5a=(400) 6b=(0.6) 7 8winsound.Beep(523,a) 9time.sleep(b) 10 11winsound.Beep(1046,a) 12time.sleep(b) 13 14counter=1 15Result=0 16speed = 9 17speed = float(speed) 18print(type(speed)) 19while 1: 20 21 Result+= 1 22 print(Result,'回目') 23 24 deadline=3600/(speed*1000/20) 25 beeplong=float(deadline)/float(8) 26 v=400*beeplong 27 z=0.6*beeplong 28 y=v+(z*900) 29 x=int((v+(z*1000))/4) 30 print (deadline) 31 32 winsound.Beep(523,int(v)) 33 time.sleep(z) 34 winsound.Beep(587,int(v)) 35 time.sleep(z) 36 winsound.Beep(659,int(v)) 37 time.sleep(z) 38 winsound.Beep(698,int(v)) 39 time.sleep(z) 40 winsound.Beep(783,int(v)) 41 time.sleep(z) 42 winsound.Beep(880,int(v)) 43 time.sleep(z) 44 winsound.Beep(987,int(v)) 45 time.sleep(z) 46 winsound.Beep(1046,int(v)) 47 time.sleep(z) 48 counter+=1 49 50 if 60<deadline*counter: 51 counter=1 52 if speed == 9.0: 53 speed+=1 54 else: 55 speed+=0.5 56 winsound.Beep(523,x) 57 winsound.Beep(587,x) 58 winsound.Beep(659,x) 59 time.sleep(x/1000) 60 else: 61 winsound.Beep(523,int(y)) 62 time.sleep(z*0.1) 63 64 print ('counter=',counter) 65 print ('deadline=',deadline) 66 print ('beeplong=',beeplong) 67 print (deadline*counter) 68 print (v) 69 print (z) 70 print ('speed=',speed) 71 72 73 deadline=3600/(speed*1000/20) 74 beeplong=float(deadline)/float(8) 75 v=400*beeplong 76 z=0.6*beeplong 77 y=v+(z*900) 78 x=int((v+(z*1000))/4) 79 print (deadline) 80 81 winsound.Beep(1046,int(v)) 82 time.sleep(z) 83 winsound.Beep(987,int(v)) 84 time.sleep(z) 85 winsound.Beep(880,int(v)) 86 time.sleep(z) 87 winsound.Beep(783,int(v)) 88 time.sleep(z) 89 winsound.Beep(698,int(v)) 90 time.sleep(z) 91 winsound.Beep(659,int(v)) 92 time.sleep(z) 93 winsound.Beep(587,int(v)) 94 time.sleep(z) 95 winsound.Beep(523,int(v)) 96 time.sleep(z) 97 counter+=1 98 99 if 60<deadline*counter: 100 counter=1 101 if speed == 9.0: 102 speed+=1 103 else: 104 speed+=0.5 105 winsound.Beep(523,x) 106 winsound.Beep(587,x) 107 winsound.Beep(659,x) 108 time.sleep(x/1000) 109 else: 110 winsound.Beep(523,int(y)) 111 time.sleep(z*0.1) 112 113 print ('counter=',counter) 114 print ('deadline=',deadline) 115 print ('beeplong=',beeplong) 116 print (deadline*counter) 117 print (v) 118 print (z) 119 print ('speed=',speed) 120

補足情報(FW/ツールのバージョンなど)

シャトルランの速度アップのルールは最初は時速8kmでレベルが2になると時速9kmになりそっからレベルが上がるごとに時速0.5kmずつ速度が上がっていきます。レベルアップの条件は1分ごとに上がっていくだけです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは

  • レベル開始時「ピロリ」と1走行中の「ドレミ~」or「~ミレド」のメロディ(楽譜)を用意
  • 各レベルのBPMと走行(繰り返し)回数を計算

します。
あとは音データをMIDI形式で作成するとよいでしょう。和音も表現できますし、音色も指定できます。
MIDIの作成はmusic21を使えば比較的簡単にできます。
参考:
20mシャトルランの速さ
20mシャトルラン(往復持久走)
シャトルランの楽譜を作ってみた

Python

1from music21 import * 2import math 3 4# レベル開始時のメロディ 5def add_start(s): 6 c = chord.Chord([note.Note('C5'),note.Note('C6')], quarterLength=0.25) 7 s.append(c) 8 c = chord.Chord([note.Note('G4'),note.Note('G5')], quarterLength=0.25) 9 s.append(c) 10 c = chord.Chord([note.Note('D5'),note.Note('D6')], quarterLength=0.5) 11 s.append(c) 12 13# 1走行中のメロディ 14def add_run(s, is_up, is_end): 15 16 # 音階の向き 17 ns = [f'{c}4' for c in 'CDEFGAB'] + ['C5'] 18 if not is_up: 19 ns.reverse() 20 s.append([note.Note(n) for n in ns]) 21 22 # 最後以外は和音が入る 23 if not is_end: 24 c = chord.Chord([note.Note('C4'),note.Note('C3')]) 25 s.append(c) 26 27 28s = stream.Stream() 29s.append(meter.TimeSignature('9/4')) 30 31st_cnt = 1 # 累積開始回 32total_cnt = 0# 累積走行数 33for i in range(19): 34 35 # 走行速度 m/h 36 if i == 0: 37 v = 8000 38 else: 39 v = 9000 + 500*(i-1) 40 41 # このレベルの回数 42 loop_cnt = math.ceil( v/60 / 20) # 1min=60sec で20mを何回走れるか 43 # ピッタリならさらに1回 44 if divmod(v/60,20)[1] == 0: 45 loop_cnt += 1 46 47 ed_cnt = st_cnt + loop_cnt - 1 # 累積終了回 48 bpm = 60 / 8000 * v 49 print(f'Lv={i+1:2}, 回数={st_cnt:3}{ed_cnt:3}({loop_cnt:2}), BPM={bpm:6.2f}, 走行速度={v/1000:4.1f}') 50 st_cnt = ed_cnt + 1 51 52 # MIDIデータの作成 53 s.append(tempo.MetronomeMark(number=bpm)) 54 add_start(s) 55 for i in range(loop_cnt): 56 add_run(s, total_cnt%2==0, i == (loop_cnt-1)) 57 total_cnt += 1 58 59s.write('midi', 'run.mid') 60print('show') 61s.show() 62""" 63Lv= 1, 回数= 1~ 7( 7), BPM= 60.00, 走行速度= 8.0 64Lv= 2, 回数= 8~ 15( 8), BPM= 67.50, 走行速度= 9.0 65Lv= 3, 回数= 16~ 23( 8), BPM= 71.25, 走行速度= 9.5 66Lv= 4, 回数= 24~ 32( 9), BPM= 75.00, 走行速度=10.0 67Lv= 5, 回数= 33~ 41( 9), BPM= 78.75, 走行速度=10.5 68Lv= 6, 回数= 42~ 51(10), BPM= 82.50, 走行速度=11.0 69Lv= 7, 回数= 52~ 61(10), BPM= 86.25, 走行速度=11.5 70Lv= 8, 回数= 62~ 72(11), BPM= 90.00, 走行速度=12.0 71Lv= 9, 回数= 73~ 83(11), BPM= 93.75, 走行速度=12.5 72Lv=10, 回数= 84~ 94(11), BPM= 97.50, 走行速度=13.0 73Lv=11, 回数= 95~106(12), BPM=101.25, 走行速度=13.5 74Lv=12, 回数=107~118(12), BPM=105.00, 走行速度=14.0 75Lv=13, 回数=119~131(13), BPM=108.75, 走行速度=14.5 76Lv=14, 回数=132~144(13), BPM=112.50, 走行速度=15.0 77Lv=15, 回数=145~157(13), BPM=116.25, 走行速度=15.5 78Lv=16, 回数=158~171(14), BPM=120.00, 走行速度=16.0 79Lv=17, 回数=172~185(14), BPM=123.75, 走行速度=16.5 80Lv=18, 回数=186~200(15), BPM=127.50, 走行速度=17.0 81Lv=19, 回数=201~215(15), BPM=131.25, 走行速度=17.5 82"""

イメージ説明

投稿2022/09/10 19:37

編集2022/09/11 02:35
can110

総合スコア38352

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

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

pimen

2022/09/10 23:22

そのMIDIの音データをパイソン上で倍速にしたりするにはどうすればいいですか?
can110

2022/09/11 00:09

もとから倍速で作成するか、BPMを変更できるソフトで編集するとよいかと思います。
pimen

2022/09/11 08:53

無限に続けたいのでプログラム上で音源を倍速にしていきながら再生していきたいのですが,,,
can110

2022/09/11 09:39

「音源を倍速にしていく」というのは質問本文に書かれている 「レベルアップの条件は1分ごとに上がっていくだけ」 とは異なるようですが具体的にどのようなルールでしょうか? 質問本文に追記ください。
pimen

2022/09/11 12:56

シャトルランの速度アップのルールは最初は時速8kmでレベルが2になると時速9kmになりそっからレベルが上がるごとに時速0.5kmずつ速度が上がっていきます。レベルアップの条件は1分ごとに上がっていくだけです。 つまり時速9㎞のLv2から一分後に時速9.5kmのLv3になるとき、20mを走り切る制限時間が8秒から7.58秒になるので音源が約1.05倍速になります。Lv4以降も同様に曲のテンポが何倍ずつ増えていくのかの計算式はコードに書いてあるので、計算式の通りに音源のスピードを変化させる方法が知りたいのです。
can110

2022/09/11 14:10

「音源のスピード」というのがBPMではないとすると、何を指しているのかが分かりませんので説明をお願いします。
pimen

2022/09/12 13:59

音源のスピードはBPMですよ。自分はシャトルランの曲をプログラムを使って曲を無限に続ける方法が知りたいのですが、 音源がどれくらいづつ早くなっていくか計算⇒楽譜を自分で作成していく というのではなく プログラムでどのくらい早くなっていくかの計算式を記述⇒プログラムが計算結果をもとに音楽をどんどん生成していく というようなプログラムが作りたかっただけです。説明不足で本当にすみません。
can110

2022/09/12 14:22

この回答は、今の質問に書かれている > ~20分までなのですが、pythonでもっと長い時間まであるシャトルランの音源を作りたい という内容に対してのものであり、そのような音源は作成できています。 さらにこのコメント欄で書かれている「曲を無限に続ける」などというのは質問本文にない条件なので 別途質問を立ててはどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問