From 1411de9dce1581d1b1a829f516dc7dc22049a51c Mon Sep 17 00:00:00 2001 From: AngelZheng Date: Tue, 18 Jan 2022 15:04:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=9C=82=E9=B8=A3=E5=99=A8=E5=BA=93=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=B8=8A=E6=B3=A2=E9=9F=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Buzzer/README.md | 10 +-- Buzzer/assets/code/NumberedMusicalNotation.py | 65 ++++++++++++------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/Buzzer/README.md b/Buzzer/README.md index 9badd7a..0479c67 100644 --- a/Buzzer/README.md +++ b/Buzzer/README.md @@ -115,9 +115,10 @@ nmn.playNotation('1') * `b数字`:音高降半音 * `+`:音高高八度 * `-`:音高降八度 -* `*`:时值延长前一个音的一半 -* `.`:时值延长一个四分音符(半音符、全音符等) -* `_`:时值减半(八分音符、十六分音符等) +* `*`(附点):时值延长前一个音的一半 +* `.`(增时线):时值延长一个四分音符(半音符、全音符等) +* `_`(减时线):时值减半(八分音符、十六分音符等) +* `~`(上波音)   以上符号可以根据简谱内容随意组合,例如: @@ -142,4 +143,5 @@ for monophonic in musicList: * 番茄沙司 * 年轻的八云紫 * 小黑鱼 -* 原Via \ No newline at end of file +* 原Via +* 宴月 \ No newline at end of file diff --git a/Buzzer/assets/code/NumberedMusicalNotation.py b/Buzzer/assets/code/NumberedMusicalNotation.py index f29c46d..7231e0f 100644 --- a/Buzzer/assets/code/NumberedMusicalNotation.py +++ b/Buzzer/assets/code/NumberedMusicalNotation.py @@ -14,6 +14,8 @@ class NumberedMusicalNotation: self.beatNumber = 4 self.preAdd = 0 + self.lastFundamentalToneRate = 0 + def tone(self, freq): self.pwm.duty(50) self.pwm.freq(freq) @@ -21,6 +23,21 @@ class NumberedMusicalNotation: def noTone(self): self.pwm.duty(0) + def play(self, rate, timeValue): + hitTime = 0.8 * timeValue + voiceTime = timeValue - hitTime + + if(rate != 0): + self.tone(int(rate * math.pow(2, self.preAdd))) + utime.sleep_ms(int(hitTime * 1000)) + self.noTone() + utime.sleep_ms(int(voiceTime * 1000)) + else: + self.noTone() + utime.sleep_ms(int(timeValue * 1000)) + + self.noTone() + def setSpeed(self, beatSpeed): self.beatSpeed = beatSpeed @@ -81,37 +98,37 @@ class NumberedMusicalNotation: digitals = ure.search(r'\d+', monophonic) scaleKey += digitals.group(0) - upNumber = monophonic.count('+') - downNumber = monophonic.count('-') - + riseNumber = monophonic.count('+') + dropNumber = monophonic.count('-') + extendNumber = monophonic.count('.') + reduceNumber = monophonic.count('_') + dottedNumber = monophonic.count('*') + upWaveNumber = monophonic.count('~') + + # 计算基本音频率 realRate = self.scaleDict[scaleKey] * \ - math.pow(2, upNumber) * (1 / math.pow(2, downNumber)) - - quarterNote = (60 / self.beatSpeed) * self.beatNumber * (1 / 4) + math.pow(2, riseNumber) * (1 / math.pow(2, dropNumber)) - upNumber = monophonic.count('.') - downNumber = monophonic.count('_') - halfNumber = monophonic.count('*') + # 计算四分音符时值 + quarterNote = (60 / self.beatSpeed) * self.beatNumber * (1.0 / 4) - timeValue = quarterNote * (1 / math.pow(2, downNumber)) + # 计算基本音时值 + timeValue = quarterNote * (1 / math.pow(2, reduceNumber)) - if(halfNumber >= 1): - timeValue *= 1.5 + # 计算附点时值 + if(dottedNumber > 0): + timeValue = timeValue * 1.5 - timeValue += quarterNote * upNumber - - hitTime = 0.8 * timeValue - voiceTime = timeValue - hitTime + # 计算延长音时值 + timeValue += quarterNote * extendNumber - if(realRate != 0): - self.tone(int(realRate * math.pow(2, self.preAdd))) - utime.sleep_ms(int(hitTime * 1000)) - self.noTone() - utime.sleep_ms(int(voiceTime * 1000)) + if(upWaveNumber == 0): + self.play(realRate, timeValue) else: - self.noTone() - utime.sleep_ms(int(timeValue * 1000)) + self.play(realRate, timeValue * 3.0 / 8) + self.play(self.lastFundamentalToneRate, timeValue * 1.0 / 4) + self.play(realRate, timeValue * 3.0 / 8) - self.noTone() + self.lastFundamentalToneRate = realRate gc.collect() -- Gitee