回答編集履歴

1

追記

2022/09/11 02:35

投稿

8524ba23
8524ba23

スコア38352

test CHANGED
@@ -1,23 +1,49 @@
1
1
  まずは
2
2
 
3
- - レベル開始時「ピロリ」と1走行中の「ドレミ~ミレド」のメロディ(楽譜)を用意
3
+ - レベル開始時「ピロリ」と1走行中の「ドレミ~」or「~ミレド」のメロディ(楽譜)を用意
4
4
  - 各レベルのBPMと走行(繰り返し)回数を計算
5
5
 
6
6
  します。
7
-
8
7
  あとは音データをMIDI形式で作成するとよいでしょう。和音も表現できますし、音色も指定できます。
9
- 各種パッケージを利用すれば、そままpythonで音声出力もできますしwavなどほかの形式も変換できます。
8
+ MIDI作成は[music21](https://web.mit.edu/music21/)を使えば比較的簡単にできます。
10
-
11
9
  参考:
12
10
  [20mシャトルランの速さ](https://newbal.wiki.fc2.com/wiki/20m%E3%82%B7%E3%83%A3%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3%E3%81%AE%E9%80%9F%E3%81%95)
13
11
  [20mシャトルラン(往復持久走)](https://www.health-net.or.jp/tairyoku_up/sub/t4_02/08.html)
14
12
  [シャトルランの楽譜を作ってみた](https://www.youtube.com/watch?v=M3AjjbbDrTU)
15
13
  ```Python
14
+ from music21 import *
16
15
  import math
17
16
 
17
+ # レベル開始時のメロディ
18
- st_cnt = 1 # 累積開始回
18
+ def add_start(s):
19
+ c = chord.Chord([note.Note('C5'),note.Note('C6')], quarterLength=0.25)
20
+ s.append(c)
21
+ c = chord.Chord([note.Note('G4'),note.Note('G5')], quarterLength=0.25)
22
+ s.append(c)
23
+ c = chord.Chord([note.Note('D5'),note.Note('D6')], quarterLength=0.5)
24
+ s.append(c)
19
25
 
26
+ # 1走行中のメロディ
27
+ def add_run(s, is_up, is_end):
28
+
29
+ # 音階の向き
30
+ ns = [f'{c}4' for c in 'CDEFGAB'] + ['C5']
31
+ if not is_up:
32
+ ns.reverse()
33
+ s.append([note.Note(n) for n in ns])
34
+
35
+ # 最後以外は和音が入る
36
+ if not is_end:
37
+ c = chord.Chord([note.Note('C4'),note.Note('C3')])
38
+ s.append(c)
39
+
40
+
41
+ s = stream.Stream()
42
+ s.append(meter.TimeSignature('9/4'))
43
+
44
+ st_cnt = 1 # 累積開始回
45
+ total_cnt = 0# 累積走行数
20
- for i in range(22):
46
+ for i in range(19):
21
47
 
22
48
  # 走行速度 m/h
23
49
  if i == 0:
@@ -32,12 +58,20 @@
32
58
  loop_cnt += 1
33
59
 
34
60
  ed_cnt = st_cnt + loop_cnt - 1 # 累積終了回
61
+ bpm = 60 / 8000 * v
62
+ print(f'Lv={i+1:2}, 回数={st_cnt:3}~{ed_cnt:3}({loop_cnt:2}), BPM={bpm:6.2f}, 走行速度={v/1000:4.1f}')
63
+ st_cnt = ed_cnt + 1
35
64
 
65
+ # MIDIデータの作成
66
+ s.append(tempo.MetronomeMark(number=bpm))
67
+ add_start(s)
36
- bpm = 60 / 8000 * v
68
+ for i in range(loop_cnt):
69
+ add_run(s, total_cnt%2==0, i == (loop_cnt-1))
70
+ total_cnt += 1
37
71
 
38
- print(f'Lv={i+1:2}, 回数={st_cnt:3}~{ed_cnt:3}({loop_cnt:2}), BPM={bpm:6.2f}, 走行速度={v/1000:4.1f}')
72
+ s.write('midi', 'run.mid')
39
-
40
- st_cnt = ed_cnt + 1
73
+ print('show')
74
+ s.show()
41
75
  """
42
76
  Lv= 1, 回数= 1~ 7( 7), BPM= 60.00, 走行速度= 8.0
43
77
  Lv= 2, 回数= 8~ 15( 8), BPM= 67.50, 走行速度= 9.0
@@ -58,10 +92,8 @@
58
92
  Lv=17, 回数=172~185(14), BPM=123.75, 走行速度=16.5
59
93
  Lv=18, 回数=186~200(15), BPM=127.50, 走行速度=17.0
60
94
  Lv=19, 回数=201~215(15), BPM=131.25, 走行速度=17.5
61
- Lv=20, 回数=216~231(16), BPM=135.00, 走行速度=18.0
62
- Lv=21, 回数=232~247(16), BPM=138.75, 走行速度=18.5
63
- Lv=22, 回数=248~263(16), BPM=142.50, 走行速度=19.0
64
95
  """
65
96
  ```
97
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-09-11/bff6bc9e-1005-4045-83d8-024b407acfb7.png)
66
98
 
67
99