67 lines
1.8 KiB
Python
67 lines
1.8 KiB
Python
|
#coding=utf-8
|
|||
|
import json
|
|||
|
|
|||
|
# 常量定义
|
|||
|
MCU_CLK = 1000000 # 12MHz,内部时钟12分频
|
|||
|
MCU_T = 1000000/MCU_CLK # 单位时间为1us
|
|||
|
# 音符映射
|
|||
|
note_mapping = {
|
|||
|
1: 'C4', 2: 'D4', 3: 'E4', 4: 'F4', 5: 'G4', 6: 'A4', 7: 'B4'
|
|||
|
}
|
|||
|
|
|||
|
# 根据频率计算计数器初值
|
|||
|
def freq_to_num(freq):
|
|||
|
T = 10**6/freq # 单位时间为1us
|
|||
|
time0 = int(2**16 - (T/2) / MCU_T)
|
|||
|
time0H = hex(time0>>8)
|
|||
|
time0L = hex(time0&0xff)
|
|||
|
print("freq = %0.2fHz, T = %dus, time0 = %d, time0H = %s, time0L = %s" % (freq, T, time0, time0H, time0L))
|
|||
|
return time0H, time0L
|
|||
|
|
|||
|
# 根据音符名称获取频率
|
|||
|
def note_to_freq(note_name):
|
|||
|
try:
|
|||
|
# 读取 JSON 文件
|
|||
|
with open('note_data.json', 'r') as file:
|
|||
|
notes = json.load(file)
|
|||
|
|
|||
|
# 获取特定音符的频率
|
|||
|
frequency = notes[note_name]['frequency']
|
|||
|
return frequency
|
|||
|
|
|||
|
except KeyError:
|
|||
|
return None
|
|||
|
except Exception as e:
|
|||
|
print(f"An error occurred: {e}")
|
|||
|
return None
|
|||
|
|
|||
|
# 根据音符名称获取计数器初值
|
|||
|
def note_to_num(note_name):
|
|||
|
frequency = note_to_freq(note_name.upper())
|
|||
|
if frequency is not None:
|
|||
|
print(f"{note_name}的频率为{frequency}Hz。")
|
|||
|
freq_to_num(frequency)
|
|||
|
else:
|
|||
|
print(f"{note_name} 不是有效的音符。")
|
|||
|
|
|||
|
|
|||
|
# 转换函数
|
|||
|
def map_tones_to_notes(tone_array):
|
|||
|
notes = []
|
|||
|
for tone in tone_array:
|
|||
|
# 将音调映射到相应的音符
|
|||
|
note = note_mapping.get((tone - 1) % 7 + 1 if tone <= 7 else (tone - 1) % 7 + 8)
|
|||
|
notes.append(note)
|
|||
|
return notes
|
|||
|
|
|||
|
# 原始数据:小星星歌曲
|
|||
|
soundtones = [
|
|||
|
1,1,5,5,6,6,5,4,4,3,3,2,2,1,
|
|||
|
5,5,4,4,3,3,2,5,5,4,4,3,3,2,
|
|||
|
1,1,5,5,6,6,5,4,4,3,3,2,2,1
|
|||
|
]
|
|||
|
if __name__ == '__main__':
|
|||
|
mapped_notes = map_tones_to_notes(soundtones)
|
|||
|
for note in mapped_notes:
|
|||
|
note_to_num(note)
|