如何用PYTHON代码写出音乐

如何用PYTHON代码写出音乐

什么是MIDI

博主本人虽然五音不全,而且唱歌还很难听,但是还是非常喜欢听歌的。我一直在做这样的尝试,就是通过人工智能算法实现机器自动的作词和编曲(在这里预告下,通过深度学习写歌词已经实现了,之后会分享给大家),本文我们主要聊下如何写曲。

说到用代码写曲子,有一个东西大家一定要了解就是MIDI。MIDI是一种乐器数字接口,是编曲界最广泛的音乐标准格式。MIDI并不是真正意义上的音乐文件,大家可以把它理解成乐谱,需要有环境编译MIDI文件,才可以生成音乐。这个关系有点像代码和编译器的关系。市面上可以解析MIDI文件的软件有很多种,本文将用到MuseScore2的软件,以下就是这个软件的截图,界面中的五线谱就是MIDI文件的呈现。这个乐谱是可以播放的,并且可以导出为MP3格式的音乐文件。

下面我们就介绍下生成MIDI文件所使用的PYTHON库。

python-midi库介绍

市面上差不多有十多种PYTHON库可以编写MIDI格式的文件,本文会推荐大家使用PYTHON-MIDI。我觉得python-midi的优势是不光可以自己写程序生成MIDI,而且还可以对MIDI文件进行解析。这样的功能配合机器学习算法,或许可以帮助我们实现机器的自动编曲,当然这是后话。先来看下如何安装python-midi。

1.首先进入https://github.com/vishnubob/python-midi#Installation,将整个项目克隆下来。

2.在程序目录下执行以下命令安装,

python setup.py install

3.如果想执行某个以mid为后缀的MIDI文件,只要执行以下命令即可:

mididump.py test.mid

接下来介绍下如何写代码生成midi文件。

实操

在python-midi库中,每个乐谱用Pattern对象表示,乐谱中的每个音轨(通常音乐都有很多轨道组成,每种乐器是一个轨道)用Track对象表示。每个音符的开端用midi.NoteOnEvent表示,结束用midi.NoteOffEvent表示,可以在参数中定义每个字符的音长和音高。示例代码如下:

生成的是一个简单的音阶:

更多有趣的音乐生成代码和样例可以关注我的微信公众号进行下载,进入公众号,输入“music”显示下载链接,谢谢。

<think>我们参考用户的需求和之前的回答,结合引用内容,设计一个更有创意的表白程序。 用户希望用Python一个表白程序,我们可以结合引用[3]的星空绘制,制作一个浪漫的星空表白场景,并在其中显示表白文字。 同时,引用[1]提到使用Python提高表白成功率,引用[2]提到生成表白图片,我们可以综合这些想法。 设计思路: 1. 绘制一个浪漫的星空背景(参考引用[3])。 2. 在星空背景上绘制一个心形,并显示表白文字。 3. 添加动态效果,比如星星闪烁,文字渐显等(使用matplotlib动画功能或Pygame)。 但是考虑到用户可能希望一个简单易行的方案,我们先使用matplotlib制作一个静态的星空表白图片,然后扩展为动画。 步骤: 静态版:星空+心形+文字 动态版(进阶):闪烁的星星,飘动的心形等。 由于引用中提到了matplotlib,我们就用matplotlib来实现静态版,然后尝试用其动画功能制作简单动画。 静态版代码示例: - 绘制黑色背景 - 随机生成星星(白色点) - 绘制一个心形(使用心形函数) - 在心形中间上表白文字 动态版:我们可以让星星的颜色或大小变化,实现闪烁效果。 由于时间关系,我们先给出静态版的完整代码,然后简单介绍如何扩展为动态。 注意:我们使用matplotlib,需要安装matplotlib和numpy。 静态版代码:</think>下面是一个结合星空背景和表白文字的Python表白程序代码示例,参考了您提供的引用内容并进行了优化: ```python import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import time def create_romantic_scene(): """创建浪漫星空背景并显示表白文字""" # 设置画布 plt.figure(figsize=(10, 8), facecolor='black') ax = plt.subplot(111, facecolor='black') plt.axis('off') # 隐藏坐标轴 # 生成随机星星 num_stars = 200 x = np.random.rand(num_stars) y = np.random.rand(num_stars) sizes = np.random.randint(1, 50, num_stars) # 绘制星星 stars = ax.scatter(x, y, s=sizes, color='white', alpha=0.7) # 添加表白文字(分阶段显示) texts = [ ("亲爱的,", 0.1, 0.9, 24, 'red'), ("遇见你是我生命中最美的意外", 0.5, 0.7, 20, 'pink'), ("你的笑容像星星一样照亮我的世界", 0.5, 0.6, 20, 'yellow'), ("我愿化作夜空中的一颗星", 0.5, 0.5, 20, 'cyan'), ("永远守护在你身边", 0.5, 0.4, 20, 'magenta'), ("你愿意和我一起走过未来的每一天吗?", 0.5, 0.3, 22, 'gold'), ("❤️ 永远爱你的程序员 ❤️", 0.5, 0.1, 28, 'red') ] # 逐步显示文字 text_objects = [] for i, (text, x_pos, y_pos, size, color) in enumerate(texts): time.sleep(0.8) # 文字显示间隔 t = ax.text(x_pos, y_pos, text, fontsize=size, color=color, ha='center', alpha=0, # 初始透明 fontname='SimHei') # 使用中文字体 t.set_alpha(1) # 设置为不透明 plt.draw() text_objects.append(t) # 添加闪烁效果 def update(frame): # 随机改变部分星星的大小 new_sizes = sizes * (0.8 + 0.4 * np.sin(frame * 0.2)) stars.set_sizes(new_sizes) # 文字呼吸效果 for i, t in enumerate(text_objects): alpha = 0.7 + 0.3 * np.sin(frame * 0.1 + i * 0.5) t.set_alpha(alpha) return stars, *text_objects # 创建动画 ani = FuncAnimation(plt.gcf(), update, frames=100, interval=50, blit=True) plt.tight_layout() plt.savefig('romantic_proposal.png', dpi=150, facecolor='black') plt.show() if __name__ == "__main__": create_romantic_scene() ``` ### 代码功能说明: 1. **星空背景**: - 创建黑色背景画布 - 随机生成200颗星星,大小和位置随机变化 - 参考了引用[3]的星空实现方法[^3] 2. **动态文字效果**: - 分阶段显示7条表白信息 - 每条信息使用不同颜色和字体大小 - 添加文字呼吸效果(透明度变化) 3. **动画效果**: - 星星大小周期性变化,模拟闪烁效果 - 文字透明度波动,营造浪漫氛围 - 使用`FuncAnimation`实现平滑动画 4. **输出结果**: - 程序运行时会动态显示表白过程 - 最后保存为高清图片`romantic_proposal.png` ### 使用说明: 1. 确保安装所需库: ```bash pip install matplotlib numpy ``` 2. 自定义表白内容: - 修改`texts`列表中的文字内容 - 调整位置参数(x_pos, y_pos) - 更改颜色和字体大小 3. 运行程序: ```bash python proposal.py ``` ### 进阶改进建议: 1. **添加背景音乐**: ```python import pygame pygame.mixer.init() pygame.mixer.music.load("romantic_music.mp3") pygame.mixer.music.play() ``` 2. **生成照片墙**: - 参考引用[2],使用PIL库将照片拼成心形[^2] ```python from PIL import Image # 实现照片拼接逻辑 ``` 3. **创建交互界面**: - 使用Pygame或Tkinter添加按钮和交互元素 - 让接收者可以点击"同意"或"拒绝" 这个程序结合了星空背景的浪漫氛围和动态文字效果,通过科技手段表达情感,正如引用[1]提到的"表白神器"概念[^1],能够有效传达心意。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值