
buzzer = pwmio.PWMOut(board.A0, duty_cycle=0, frequency=440, variable_frequency=True) def play_tone(frequency, duration): if frequency == 0: buzzer.duty_cycle = 0 else: buzzer.frequency = frequency buzzer.duty_cycle = 32768 time.sleep(duration) buzzer.duty_cycle = 0 time.sleep(0.05)3.2 音符的实现
# 音调频率表 yifu_f = [262, 360, 460, 569, 760, 860, 960, 1060, 1160, 1260, 1360, 1460, 1560, 1660] # ----------------------- # 八阶音符定义 # ----------------------- # 八阶音符频率 (C4-C5 八度) # 低音到高音: C4, D4, E4, F4, G4, A4, B4, C5 # 对应的颜色映射: 红, 橙, 黄, 绿, 青, 蓝, 紫, 白 note_frequencies = [262, 294, 330, 349, 392, 440, 494, 523] # 单位: Hz # 音符时长定义 QUARTER_NOTE = 0.2 # 四分音符时长 EIGHTH_NOTE = 0.1 # 八分音符时长 def get_note_for_color(r, g, b): """根据RGB值确定要播放的音符和时长""" # 确定主色调 max_val = max(r, g, b) if max_val == 0: return 0, QUARTER_NOTE # 黑色,无声 # 计算颜色比例 r_ratio = r / max_val g_ratio = g / max_val b_ratio = b / max_val # 根据颜色确定音符 if r_ratio > 0.8 and g_ratio < 0.3 and b_ratio < 0.3: # 红色 return note_frequencies[0], QUARTER_NOTE elif r_ratio > 0.8 and g_ratio > 0.5 and b_ratio < 0.3: # 橙色/黄色 return note_frequencies[1], QUARTER_NOTE elif r_ratio > 0.7 and g_ratio > 0.7 and b_ratio < 0.3: # 黄色 return note_frequencies[2], QUARTER_NOTE elif r_ratio < 0.3 and g_ratio > 0.8 and b_ratio < 0.3: # 绿色 return note_frequencies[3], QUARTER_NOTE elif r_ratio < 0.3 and g_ratio > 0.8 and b_ratio > 0.8: # 青色 return note_frequencies[4], QUARTER_NOTE elif r_ratio < 0.3 and g_ratio < 0.3 and b_ratio > 0.8: # 蓝色 return note_frequencies[5], QUARTER_NOTE elif r_ratio > 0.7 and g_ratio < 0.3 and b_ratio > 0.7: # 紫色 return note_frequencies[6], QUARTER_NOTE elif r_ratio > 0.7 and g_ratio > 0.7 and b_ratio > 0.7: # 白色/灰色 return note_frequencies[7], QUARTER_NOTE else: # 其他颜色,根据亮度决定音符 # 亮度值映射到音符 brightness = (r + g + b) / 3 note_index = int((brightness / 255) * 7) note_index = max(0, min(7, note_index)) duration = QUARTER_NOTE if brightness > 127 else EIGHTH_NOTE return note_frequencies[note_index], duration def play_melody(r, g, b): """播放八阶音符组成的旋律""" # 获取基本音符 base_freq, base_duration = get_note_for_color(r, g, b) if base_freq == 0: # 无声 time.sleep(base_duration) return # 播放简单的旋律:主音符 + 上方三度 + 主音符 # 计算三度音程 third_freq = int(base_freq * 1.25) # 大三度 # 播放旋律 play_tone(base_freq, base_duration) play_tone(third_freq, base_duration * 0.5) play_tone(base_freq, base_duration * 0.5)
至此,完成了diy的基本任务。
我要赚赏金
