当前位置: 首页 > news >正文

树莓派pico蜂鸣器播放音乐

"""
Micropython (Raspberry Pi Pico)
Plays music written on onlinesequencer.net through a passive piezo buzzer.
Uses fast arpeggios with a single buzzer to simulate polyphony
Also supports multiple buzzers at once for real polyphony
https://github.com/james1236/buzzer_music
"""from machine import Pin, PWM
from math import ceiltones = {'C0':16, 'C#0':17, 'D0':18, 'D#0':19, 'E0':21, 'F0':22,'F#0':23, 'G0':24, 'G#0':26, 'A0':28, 'A#0':29, 'B0':31,'C1':33, 'C#1':35, 'D1':37, 'D#1':39, 'E1':41, 'F1':44,'F#1':46, 'G1':49, 'G#1':52, 'A1':55, 'A#1':58, 'B1':62,'C2':65, 'C#2':69, 'D2':73, 'D#2':78, 'E2':82, 'F2':87,'F#2':92, 'G2':98, 'G#2':104, 'A2':110, 'A#2':117, 'B2':123,'C3':131, 'C#3':139, 'D3':147, 'D#3':156, 'E3':165, 'F3':175,'F#3':185, 'G3':196, 'G#3':208, 'A3':220, 'A#3':233, 'B3':247,'C4':262, 'C#4':277, 'D4':294, 'D#4':311, 'E4':330, 'F4':349,'F#4':370, 'G4':392, 'G#4':415, 'A4':440, 'A#4':466, 'B4':494,'C5':523, 'C#5':554, 'D5':587, 'D#5':622, 'E5':659, 'F5':698,'F#5':740, 'G5':784, 'G#5':831, 'A5':880, 'A#5':932, 'B5':988,'C6':1047, 'C#6':1109, 'D6':1175, 'D#6':1245, 'E6':1319, 'F6':1397,'F#6':1480, 'G6':1568, 'G#6':1661, 'A6':1760, 'A#6':1865, 'B6':1976,'C7':2093, 'C#7':2217, 'D7':2349, 'D#7':2489, 'E7':2637, 'F7':2794,'F#7':2960, 'G7':3136, 'G#7':3322, 'A7':3520, 'A#7':3729, 'B7':3951,'C8':4186, 'C#8':4435, 'D8':4699, 'D#8':4978, 'E8':5274, 'F8':5588,'F#8':5920, 'G8':6272, 'G#8':6645, 'A8':7040, 'A#8':7459, 'B8':7902,'C9':8372, 'C#9':8870, 'D9':9397, 'D#9':9956, 'E9':10548, 'F9':11175,'F#9':11840, 'G9':12544, 'G#9':13290, 'A9':14080, 'A#9':14917, 'B9':15804
}#Time, Note, Duration, Instrument (onlinesequencer.net schematic format)
#0 D4 8 0;0 D5 8 0;0 G4 8 0;8 C5 2 0;10 B4 2 0;12 G4 2 0;14 F4 1 0;15 G4 17 0;16 D4 8 0;24 C4 8 0class music:def __init__(self, songString='0 D4 8 0', looping=True, tempo=3, duty=2512, pin=None, pins=[Pin(0)]):self.tempo = tempoself.song = songStringself.looping = loopingself.duty = dutyself.stopped = Falseself.timer = -1self.beat = -1self.arpnote = 0self.pwms = []if (not (pin is None)):pins = [pin]i = 0for pin in pins:self.pwms.append(PWM(pins[i]))i = i + 1self.notes = []self.playingNotes = []self.playingDurations = []#Find the end of the songself.end = 0splitSong = self.song.split(";")for note in splitSong:snote = note.split(" ")testEnd = round(float(snote[0])) + ceil(float(snote[2]))if (testEnd > self.end):self.end = testEnd#Create empty song structurewhile (self.end > len(self.notes)):self.notes.append(None)#Populate song structure with the notesfor note in splitSong:snote = note.split(" ")beat = round(float(snote[0]));if (self.notes[beat] == None):self.notes[beat] = []self.notes[beat].append([snote[1],ceil(float(snote[2]))]) #Note, Duration#Round up end of song to nearest barself.end = ceil(self.end / 8) * 8def stop(self):for pwm in self.pwms:pwm.deinit()self.stopped = Truedef tick(self):if (not self.stopped):self.timer = self.timer + 1#Loopif (self.timer % (self.tempo * self.end) == 0 and (not (self.timer == 0))):if (not self.looping):self.stop()return Falseself.beat = -1self.timer = 0#On Beatif (self.timer % self.tempo == 0):self.beat = self.beat + 1#Remove expired notes from playing listi = 0while (i < len(self.playingDurations)):self.playingDurations[i] = self.playingDurations[i] - 1if (self.playingDurations[i] <= 0):self.playingNotes.pop(i)self.playingDurations.pop(i)else:i = i + 1#Add new notes and their durations to the playing list"""#Old method runs for every note, slow to process on every beat and causes noticeable delayssong = song.split(";")for note in ssong:snote = note.split(" ")if int(snote[0]) == beat:playingNotes.append(snote[1])playingDurations.append(int(snote[2]))"""if (self.beat < len(self.notes)):if (self.notes[self.beat] != None):for note in self.notes[self.beat]:self.playingNotes.append(note[0])self.playingDurations.append(note[1])#Only need to run these checks on beatsi = 0for pwm in self.pwms:if (i >= len(self.playingNotes)):pwm.duty_u16(0)else:#Play notepwm.duty_u16(self.duty)pwm.freq(tones[self.playingNotes[i]])i = i + 1#Play arp of all playing notesif (len(self.playingNotes) > len(self.pwms)):self.pwms[len(self.pwms)-1].duty_u16(self.duty)if (self.arpnote > len(self.playingNotes)-len(self.pwms)):self.arpnote = 0self.pwms[len(self.pwms)-1].freq(tones[self.playingNotes[self.arpnote+(len(self.pwms)-1)]])self.arpnote = self.arpnote + 1return Trueelse:return False
http://www.jsqmd.com/news/390426/

相关文章:

  • 树莓派 pico W(创客版)RP2020 W代码示例温度检测+液晶显示屏+HTTP服务器页面控制灯光
  • OpenClaw 产品定位
  • 钣金客户
  • 寒假学习笔记2.6
  • 寒假学习笔记2.5
  • 基于Spring Boot的酒店在线预订系统的开发与实现
  • day88(2.17)——leetcode面试经典150
  • 基于springboot企业员工信息管理系统_j57rz435
  • 基于SpringBoot的宠物寄领养网站的设计与实现_6fmr5z12
  • java毕业设计基于Spring Boot的危废料管理信息系统
  • 服务器运维(四十一)日服务器linux-audit.log分析工具—东方仙盟
  • 基于Spring Boot的戏曲平台的设计与实现
  • [嵌入式系统-240]:信号调理电路中的集成运放放大器的作用、种类、工作原理、示例
  • 成本治理(Cloud Cost Governance)是什么?
  • [嵌入式系统-239]:多路选择:模拟多路开关与数字多路开关
  • 信息论与编码篇---线性失真 vs 非线性失真
  • 信息论与编码篇---总谐波失真加噪声
  • LLM | 完全面向算法的 VeRL 代码阅读笔记
  • 魔兽世界伤害计算公式
  • 提示工程架构师请注意!Agentic AI对抗样本防御的10大核心技巧
  • 2026-02-17学习
  • 宇树科技 CEO 王兴兴所说的“具身智能时代的牛顿还没诞生”
  • 寒假学习笔记2.4
  • 存在即对话:方见华对话本体论与世毫九理论的数学奠基、形式证明与工程实现
  • 寒假学习笔记2.3
  • 摩尔线程快速完成对Qwen3.5模型全面适配
  • 如何通过数据分析实现精准营销
  • 20260217
  • Ubuntu 上 ROS2 的安装
  • 协同过滤算法Nodejs+vue3的短视频分享网站系统