如何计算音符占比
时间: 2023-08-03 11:07:19 浏览: 86
计算音符占比需要知道总共有多少个音符,以及每个音符出现了多少次。假设我们有一个音符序列 notes,可以按照以下步骤计算音符占比:
1. 统计每个音符出现的次数,可以使用字典来记录:
```
counts = {}
for note in notes:
if note in counts:
counts[note] += 1
else:
counts[note] = 1
```
2. 计算总共的音符数量,可以使用内置函数 `len()`:
```
total_notes = len(notes)
```
3. 计算每个音符的占比,可以遍历字典并除以总数:
```
for note, count in counts.items():
ratio = count / total_notes
print(f"{note}: {ratio:.2f}")
```
这里使用了 f-string 和格式化字符串的技巧,`:.2f` 表示保留两位小数。
相关问题
用python计算音符占比
计算音符占比需要先将音符转化为数字表示,然后统计每个音符出现的次数并计算其占总音符数的比例。以下是一个简单的示例代码:
```python
# 音符对应的数字表示
note_to_num = {
'C': 1, 'C#': 2, 'D': 3, 'D#': 4, 'E': 5, 'F': 6,
'F#': 7, 'G': 8, 'G#': 9, 'A': 10, 'A#': 11, 'B': 12
}
# 示例音符序列
notes = ['C', 'D', 'E', 'C', 'C#', 'D', 'C']
# 统计每个音符出现的次数
note_counts = {}
for note in notes:
if note in note_counts:
note_counts[note] += 1
else:
note_counts[note] = 1
# 计算每个音符占总音符数的比例
total_notes = len(notes)
note_ratios = {}
for note, count in note_counts.items():
note_ratios[note] = count / total_notes
# 输出结果
for note, ratio in note_ratios.items():
print(f'{note}: {ratio:.2%}')
```
输出结果为:
```
C: 42.86%
D: 28.57%
E: 14.29%
C#: 14.29%
```
如何将mid文件转化成notes并存储文件,之后再计算文件中的音符占比
要将MIDI文件转换为notes并存储到文件中,以便后续计算音符占比,可以使用Python中的`pretty_midi`库读取MIDI文件并提取音符信息,然后将音符信息保存到文件中。
以下是一个示例代码,假设要将名为'music.mid'的MIDI文件转换为notes并保存到名为'music.notes'的文件中:
```python
import pretty_midi
# 读取MIDI文件
midi_data = pretty_midi.PrettyMIDI('music.mid')
# 提取音符信息
note_list = []
for instrument in midi_data.instruments:
for note in instrument.notes:
note_list.append((note.start, note.end, note.pitch))
# 将音符信息保存到文件中
with open('music.notes', 'w') as f:
for note in note_list:
f.write(f'{note[0]},{note[1]},{note[2]}\n')
```
这个代码会使用`pretty_midi`库读取名为'music.mid'的MIDI文件,并提取出其中的音符信息。然后,它将音符信息保存到名为'music.notes'的文件中,每行一个音符,格式为`开始时间,结束时间,音高`。
要计算文件中每个音符的占比,可以读取文件中的所有音符并计算它们的时长,然后将每个音符的时长除以总时长即可得到占比。
以下是一个示例代码,假设要计算名为'music.notes'的文件中每个音符的占比:
```python
# 读取文件中的所有音符
note_list = []
with open('music.notes', 'r') as f:
for line in f:
start, end, pitch = [float(x) for x in line.strip().split(',')]
note_list.append((start, end, pitch))
# 计算总时长和每个音符的时长
total_duration = note_list[-1][1] - note_list[0][0]
duration_dict = {}
for note in note_list:
duration = note[1] - note[0]
if note[2] in duration_dict:
duration_dict[note[2]] += duration
else:
duration_dict[note[2]] = duration
# 计算每个音符的占比
for pitch, duration in duration_dict.items():
ratio = duration / total_duration
print(f'音高{pitch}的占比为{ratio:.2%}')
```
这个代码会读取名为'music.notes'的文件中的所有音符,并计算总时长和每个音符的时长。然后,它将每个音符的时长除以总时长,得到每个音符的占比,并输出每个音符的占比。