用python演奏Merry Christmas Mr. Lawrence(圣诞快乐劳伦斯先生)

最近在B站上发了视频《圣诞快乐劳伦斯先生,但python》https://www.bilibili.com/video/BV1Be411r7NL/?vd_source=3b3b7ddff3aded8bd4e6b73fbc08c6e7
简单记录一下自己实现代码的过程,虽然也是根据别人的代码改编的。。。

一、准备工作

前期准备工作最难的就是pygame库。我是用的pycharm,直接settings没办法下,pip也报错,如果你们这两种方法试过都可行就当我没说。。。

https://blog.csdn.net/liuboxx1/article/details/79570351
我是找的上面这位博主的方法,先下载对应的版本,再放到python的环境里面的。
pygame下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
在这里插入图片描述
我是用的pytorch,所以下载之后,把这个文件放在pytorch的环境里面。
然后直接pip对应的版本就可以了

pip install pygame-2.1.2-cp39-cp39-win_amd64.whl

二、找简谱

简谱地址:https://www.bilibili.com/read/cv20800994/
我用的是B站up主做的简谱,因为这个谱的前奏是有节奏的。其他的谱我也用过,因为是机器弹的,所以如果节奏都是一样的听起来很单调寡淡,俗称没有灵魂。
在这里插入图片描述
这个地方解释一下J=50的意思,我百度了一下,是一分钟演奏50拍的意思。J=51,J=52同理

三、代码介绍

music(3, a + 1, 0.5)

这个代码里面,每一行,就是一个音。比如这个,第一个参数3代表的就是mi这个音(直接看谱,谱上是什么就写什么)。第二个参数a+1代表的就是高音(数字上面有一个点就是a+1,没点就是a,数字下面有点就是a-1)第三个参数就是持续时间,这里是0.5,就是0.5拍。

#51
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)

这里对于J=51(一分钟演奏51拍)的处理,我是简单粗暴的给他减去0.01拍,你们这里直接写0.49也行。

然后,大家就可以永无止境的肝了哈哈哈

这里放我写的完整代码:

#代码原文
#https://blog.csdn.net/weixin_44351032/article/details/132627167?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-132627167-blog-128551130.235%5Ev39%5Epc_relevant_anti_vip&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-132627167-blog-128551130.235%5Ev39%5Epc_relevant_anti_vip&utm_relevant_index=5
#谱
#https://www.bilibili.com/read/cv20800994/
#安装pygame
#https://blog.csdn.net/liuboxx1/article/details/79570351
import os
import threading
import time

import mido
import pygame

mid = mido.MidiFile()
track = mido.MidiTrack()
mid.tracks.append(track)


def play_midi(file):
    freq = 44100
    bitsize = -16
    channels = 2
    buffer = 1024
    pygame.mixer.init(freq, bitsize, channels, buffer)
    pygame.mixer.music.set_volume(1)
    clock = pygame.time.Clock()
    try:
        pygame.mixer.music.load(file)
    except:
        import traceback
        print(traceback.format_exc())
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        clock.tick(30)


KEY = 1
neg_SPEED = 1.2  # 数值越小速度越快


# bpm = \frac{60000000}{tempo}
def music(note, base_num, base_time):
    base_num, base_time = base_num + KEY, base_time * neg_SPEED
    # mid = mido.MidiFile()
    # track = mido.MidiTrack()
    # mid.tracks.append(track)
    # meta_time = 60 * 60 * 10 / bpm
    major_notes = [0, 2, 2, 1, 2, 2, 2, 1]
    base_note = 60
    track.append(mido.Message('note_on', note=base_note + base_num * 12 + sum(major_notes[0:note]), velocity=96, time=0,
                              channel=1))
    track.append(mido.Message('note_off', note=base_note + base_num * 12 + sum(major_notes[0:note]), velocity=96,
                              time=int(480 * base_time), channel=1))
    # print('正在合成(',note, base_num, base_time,')音')
    # track.append(mido.Message('note_on', note=base_note, velocity=96, time=0))
    # track.append(mido.Message('note_off', note=base_note, velocity=96, time=480*base_time))
    # mid.save('1.mid')
    # play_midi('1.mid')


def lemon_music():
    a = 0
    b = 1
    # 前奏
    # music(1, a+b + 1, 2)

#50
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(6, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)

    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(6, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)

#51
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)

    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)

#52
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

#51
    music(7, a + 0, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)

    music(7, a + 0, 0.5-0.01)
    music(6, a + 0, 0.5-0.01)
    music(7, a + 0, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(7, a + 0, 0.5-0.01)
    music(6, a + 0, 0.5-0.01)

#52
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(6, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(6, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

    # 51
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)

    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(5, a + 1, 0.5-0.01)
    music(3, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)

    # 52
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(7, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(7, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

#51
    music(7, a + 0, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(7, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)

    music(5, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)
    music(7, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)

#第三行
#52
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(6, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(6, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

#52
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)

#52
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

    #52
    music(7, a + 0, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(5, a + 1, 0.5-0.02)
    music(2, a + 1, 0.5-0.02)
    music(1, a + 1, 0.5-0.02)

    music(7, a + 0, 0.5-0.02)
    music(6, a + 0, 0.5-0.02)
    music(7, a + 0, 0.5-0.02)
    music(3, a + 1, 0.5-0.02)
    music(7, a + 0, 0.5-0.02)
    music(6, a + 0, 0.5-0.02)

#第四行
#53

    music(3, a + 1, 0.5-0.03)
    music(2, a + 1, 0.5-0.03)
    music(3, a + 1, 0.5-0.03)
    music(6, a + 1, 0.5-0.03)
    music(3, a + 1, 0.5-0.03)
    music(2, a + 1, 0.5-0.03)

    music(3, a + 1, 0.5-0.03)
    music(2, a + 1, 0.5-0.03)
    music(3, a + 1, 0.5-0.03)
    music(6, a + 1, 0.5-0.03)
    music(3, a + 1, 0.5-0.03)
    music(2, a + 1, 0.5-0.03)

    # 52
    music(3, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(3, a + 1, 0.5 - 0.02)
    music(5, a + 1, 0.5 - 0.02)
    music(3, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)

    music(3, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(3, a + 1, 0.5 - 0.02)
    music(5, a + 1, 0.5 - 0.02)
    music(3, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)

    # 52
    music(2, a + 1, 0.5 - 0.02)
    music(1, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(7, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(1, a + 1, 0.5 - 0.02)

    music(5, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(1, a + 1, 0.5 - 0.02)
    music(7, a + 1, 0.5 - 0.02)
    music(2, a + 1, 0.5 - 0.02)
    music(1, a + 1, 0.5 - 0.02)

#51
    music(7, a + 0, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(7, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)

    music(5, a + 1, 0.5-0.01)
    music(2, a + 1, 0.5-0.01)
    music(1, a + 1, 0.5-0.01)
    music(7, a + 1, 0.5-0.01+0.25)

    track.append(mido.Message('note_on', note=0, velocity=0, time=0))
    track.append(mido.Message('note_off', note=0, velocity=0, time=480 * 1))

#主歌部分
    #100
    music(2, a + 0, 0.5)
    music(3, a + 0, 0.5)
    music(2, a + 0, 0.5)
    music(6, a - 1, 0.5)
    music(2, a + 0, 2)

    music(0, a + 0, 1)
    music(2, a + 0, 0.5)
    music(3, a + 0, 0.5)
    music(2, a + 0, 0.5)
    music(3, a + 0, 0.5)
    music(5, a + 0, 0.5)
    music(3, a + 0, 0.5)

    music(2, a + 0, 0.5)
    music(3, a + 0, 0.5)
    music(2, a + 0, 0.5)
    music(6, a - 1, 0.5)
    music(1, a + 0, 2)

    music(0, a + 0, 1)
    music(1, a + 1, 1)
    music(7, a + 0, 0.5)
    music(5, a + 0, 0.5)
    music(3, a + 0, 1)

    music(2, a + 0, 0.5)
    music(3, a + 0, 0.5)
    music(2, a + 0, 0.5)
    music(6, a - 1, 0.5)
    music(2, a + 0, 2)

    #99
    music(0, a + 0, 1 + 0.01)
    music(2, a + 0, 0.5 + 0.01)
    music(3, a + 0, 0.5 + 0.01)
    music(2, a + 0, 0.5 + 0.01)
    music(3, a + 0, 0.5 + 0.01)
    music(5, a + 0, 0.5 + 0.01)
    music(3, a + 0, 0.5 + 0.01)

    music(2, a + 0, 0.5 + 0.01)
    music(3, a + 0, 0.5 + 0.01)
    music(2, a + 0, 0.5 + 0.01)
    music(1, a + 0, 0.5 + 0.01)
    music(6, a - 1, 4 + 0.01)
    music(0, a + 0, 1 + 0.01)
    music(0, a + 0, 1 + 0.01)

    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(6, a + 0, 0.5 + 0.01)
    music(2, a + 1, 2 + 0.01)

    music(0, a + 0, 1 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(5, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)

    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(6, a + 0, 0.5 + 0.01)
    music(1, a + 1, 2 + 0.01)

    music(0, a + 0, 1 + 0.01)
    music(1, a + 2, 1 + 0.01)
    music(7, a + 1, 0.5 + 0.01)
    music(5, a + 1, 0.5 + 0.01)
    music(3, a + 1, 1 + 0.01)

    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(6, a + 0, 0.5 + 0.01)
    music(2, a + 1, 2 + 0.01)

    music(0, a + 0, 1 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(5, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)

    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(1, a + 1, 0.5 + 0.01)
    music(6, a + 0, 4 + 0.01)
    music(0, a + 0, 1 + 0.01)
    music(0, a + 0, 1 + 0.01)

    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(6, a + 0, 0.5 + 0.01)
    music(2, a + 1, 2 + 0.01)

    music(0, a + 0, 1 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(2, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)
    music(5, a + 1, 0.5 + 0.01)
    music(3, a + 1, 0.5 + 0.01)

    #98
    music(2, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)
    music(2, a + 1, 0.5 + 0.02)
    music(6, a + 0, 0.5 + 0.02)
    music(1, a + 1, 2 + 0.02)

    music(0, a + 0, 1 + 0.02)
    music(1, a + 2, 1 + 0.02)
    music(7, a + 1, 0.5 + 0.02)
    music(5, a + 1, 0.5 + 0.02)
    music(3, a + 1, 1 + 0.02)

    music(2, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)
    music(2, a + 1, 0.5 + 0.02)
    music(6, a + 0, 0.5 + 0.02)
    music(2, a + 1, 2 + 0.02)

#97
    music(0, a + 0, 1 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(5, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)

    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(1, a + 1, 0.5 + 0.03)
    music(6, a + 0, 2 + 0.03)

    music(0, a + 0, 1 + 0.03)
    music(0, a + 0, 1 + 0.03)
    music(7, a - 1, 1 + 0.03)
    music(1, a + 0, 1 + 0.03)

    #主歌第五行
    #97
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 1 + 0.03)
    music(6, a + 0, 1 + 0.03)
    music(6, a + 0, 1 + 0.03)#连音

    music(5, a + 0, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 1 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)

    music(3, a + 0, 0.5 + 0.03)
    music(2, a + 0, 0.5 + 0.03)
    music(3, a + 0, 0.5 + 0.03)
    music(2, a + 0, 1 + 0.03)
    music(3, a + 0, 1 + 0.03)
    music(3, a + 0, 1 + 0.03)#连音

    music(2, a + 0, 0.5 + 0.03)
    music(3, a + 0, 0.5 + 0.03)
    music(2, a + 0, 1 + 0.03)
    music(0, a + 0, 0.5 + 0.03)
    music(3, a + 0, 0.5 + 0.03)
    music(4, a + 0, 0.5 + 0.03)

    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 1 + 0.03)
    music(6, a + 0, 1 + 0.03)
    music(6, a + 0, 1 + 0.03)#连音

    music(5, a + 0, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 1 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(5, a + 0, 0.5 + 0.03)
    music(4, a + 0, 0.5 + 0.03)

    music(3, a + 0, 0.5 + 0.03)
    music(2, a + 0, 0.5 + 0.03)
    music(3, a + 0, 0.5 + 0.03)
    music(6, a + 0, 1 + 0.03)
    music(3, a + 0, 1 + 0.03)
    music(3, a + 0, 1 + 0.03)#连音

    music(2, a + 0, 0.5 + 0.03)
    music(3, a + 0, 0.5 + 0.03)#升高半音做不到
    music(5, a + 0, 2.5 + 0.03)

    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(6, a + 0, 0.5 + 0.03)
    music(2, a + 1, 2 + 0.03)


    music(0, a + 0, 1 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(2, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)
    music(5, a + 1, 0.5 + 0.03)
    music(3, a + 1, 0.5 + 0.03)


    #100
    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(6, a + 0, 0.5)
    music(1, a + 1, 2 )

    music(0, a + 0, 1 )
    music(1, a + 2, 1 )
    music(7, a + 1, 0.5 )
    music(5, a + 1, 0.5 )
    music(3, a + 1, 1 )

    music(2, a + 1, 0.5 )
    music(3, a + 1, 0.5 )
    music(2, a + 1, 0.5 )
    music(6, a + 0, 0.5 )
    music(2, a + 1, 2 )

    music(0, a + 0, 1 )
    music(2, a + 1, 0.5 )
    music(3, a + 1, 0.5 )
    music(2, a + 1, 0.5 )
    music(3, a + 1, 0.5 )
    music(5, a + 1, 0.5 )
    music(3, a + 1, 0.5 )


    #101
    music(2, a + 1, 0.5 -0.01)
    music(3, a + 1, 0.5 -0.01)
    music(2, a + 1, 0.5 -0.01)
    music(1, a + 1, 0.5 -0.01)
    music(6, a + 0, 2 -0.01)

#100
    music(2, a + 1, 0.5)
    music(7, a + 0, 0.5)
    music(1, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(7, a + 0, 0.5)
    music(1, a + 1, 0.5)
    music(7, a + 0, 0.5)


    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(6, a + 0, 0.5)
    music(2, a + 1, 2)

    music(0, a + 0, 1)
    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(5, a + 1, 0.5)
    music(3, a + 1, 0.5)

    music(2, a + 1, 0.5)
    music(3, a + 1, 0.5)
    music(2, a + 1, 0.5)
    music(6, a + 0, 0.5)
    music(1, a + 1, 2)

    music(0, a + 0, 1 )
    music(1, a + 2, 1 )
    music(7, a + 1, 0.5 )
    music(5, a + 1, 0.5 )
    music(3, a + 1, 1 )

    music(2, a + 1, 0.5 )
    music(3, a + 1, 0.5 )
    music(2, a + 1, 0.5 )
    music(6, a + 0, 0.5 )
    music(2, a + 1, 2 )

#98
    music(0, a + 0, 1 + 0.02)
    music(2, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)
    music(2, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)
    music(5, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)

    music(2, a + 1, 0.5 + 0.02)
    music(3, a + 1, 0.5 + 0.02)
    music(2, a + 1, 0.5 + 0.02)
    music(1, a + 1, 0.5 + 0.02)
    music(6, a + 0, 1 + 0.02)
    music(1, a + 1, 0.5 + 0.02)
    music(1, a + 1, 0.5 + 0.02)

# #108
    music(5, a + 0, 1.5 -0.08)
#     music(5, a + 0, 0.5 -0.08)
#     music(5, a + 0, 1 -0.08)
#     music(3, a + 0, 0.5 -0.08)
#     music(3, a + 0, 0.5 -0.08)
#
#     music(3, a + 0, 1 -0.08)

lemon_music()
mid.save('a2.mid')


def play():
    play_midi('a2.mid')


# def show():
#     for i in f.readlines():
#         print("\033[0;34;40m%s\033[0m" % i)
#         time.sleep(len(i) / 3)
#         os.system('cls')


if __name__ == '__main__':
    # f = open('lyrics.txt', 'r', encoding='utf-8')
    t1 = threading.Thread(target=play)
    # t2 = threading.Thread(target=show)
    t1.start()
    # t2.start()
    # os.remove('a2.mid')

直接运行就可以听《圣诞快乐劳伦斯先生》啦~

改进建议:
1.多线程演奏:现在的是简谱,是一个一个音往外蹦的,后续可以考虑多线程加上和弦。
2.升高半音:音阶的函数设置的是int,只能是整数,做不到升高半音#。
3.处理顿音(倒三角符号)。
4.处理渐强、减弱。5.模拟其他乐器声音,比如中间的一段小提琴

参考:
代码原文:
https://blog.csdn.net/weixin_44351032/article/details/132627167?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-132627167-blog-128551130.235%5Ev39%5Epc_relevant_anti_vip&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2-132627167-blog-128551130.235%5Ev39%5Epc_relevant_anti_vip&utm_relevant_index=5

https://www.bilibili.com/read/cv20800994/
安装pygame
https://blog.csdn.net/liuboxx1/article/details/79570351

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中使用MQTT协议进行通信可以使用paho-mqtt库,同时也支持TLS/SSL加密。下面是一个简单的示例程序: ```python import ssl import paho.mqtt.client as mqtt # MQTT连接信息 mqtt_broker = "broker.example.com" mqtt_port = 8883 mqtt_username = "username" mqtt_password = "password" # TLS/SSL证书信息 ca_cert = "/path/to/ca.crt" client_cert = "/path/to/client.crt" client_key = "/path/to/client.key" def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test/topic") def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.tls_set(ca_cert, certfile=client_cert, keyfile=client_key, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2) client.username_pw_set(mqtt_username, mqtt_password) client.on_connect = on_connect client.on_message = on_message client.connect(mqtt_broker, mqtt_port, 60) client.loop_forever() ``` 在此示例中,我们导入了`ssl`和`paho.mqtt.client`库,然后设置MQTT连接信息和TLS/SSL证书信息。在`on_connect`和`on_message`函数中,我们定义了当连接成功和收到消息时的行为。最后,我们创建了一个MQTT客户端对象,设置TLS/SSL证书,连接到MQTT代理,并开始循环以处理所有MQTT事件。 如果您没有TLS/SSL证书,可以使用以下代码禁用TLS/SSL加密: ```python import paho.mqtt.client as mqtt # MQTT连接信息 mqtt_broker = "broker.example.com" mqtt_port = 1883 mqtt_username = "username" mqtt_password = "password" def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test/topic") def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.username_pw_set(mqtt_username, mqtt_password) client.on_connect = on_connect client.on_message = on_message client.connect(mqtt_broker, mqtt_port, 60) client.loop_forever() ``` 在此示例中,我们将MQTT端口设置为1883,并禁用了TLS/SSL加密。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值