101超酷!用Python写回文音乐,3步搞定你的MIDI创作处女作

news/2025/10/30 9:53:33/文章来源:https://www.cnblogs.com/oeasy/p/19175989
101超酷!用Python写回文音乐,3步搞定你的MIDI创作处女作

回环诗_旋律模进_开嗓音频生成_sequence

回忆

  • 上次 研究了 回文诗

    • 对称 的 文字

    • 可以用 列表反转 的 方式

    • 进行判断

图片描述

  • 音符也可以 实现 类似于 回文的效果

    • 卡农螃蟹曲式

图片描述

  • 能做段 简单的 回文音乐 吗?🤔

  • 怎么 才能 唱出 歌词 呢?

回文开嗓歌

图片描述

  • 可以下载x-studio

    • https://xstudio.music.163.com/

图片描述

具体过程

  • 让 虚拟歌姬 唱歌 应该分两步

    1. 在软件中 导入 开嗓旋律 的 mid

    2. 然后 右键音符 编辑全部歌词

图片描述

  • 去 生成mid

哼鸣练习

  • 曲式的对称 很像 回文的对称

图片描述

  • 配合回文

图片描述

  • 能用代码 生成这个mid吗?

提示词

图片描述

ide启动

  • 首先新建文件

    • m.py

图片描述

humming

from mido import Message, MidiFile, MidiTrack# 创建一个新的MIDI文件和音轨
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)# 定义C4对应的MIDI音符编号
c4_note = 60# 定义每个音符的持续时间(这里设为0.5秒,可按需调整)
note_duration = 0.5
# 定义BPM(每分钟节拍数),控制节奏速度
bpm = 120
# 计算每拍对应的时间(秒)
tick_per_beat = mid.ticks_per_beat
time_per_beat = 60 / bpm
time_per_tick = time_per_beat / tick_per_beat# 定义“哆来咪发嗦发咪来哆”对应的音符偏移量
# 基于C4(60号音符),在C大调中,各音符偏移量对应关系
note_offsets = [0, 2, 4, 5, 7, 5, 4, 2, 0]# 遍历音符偏移量来添加音符事件到音轨
for offset in note_offsets:note_number = c4_note + offset# 按下音符事件track.append(Message('note_on', note=note_number, velocity=64, time=0))# 计算音符持续时间对应的tick数tick_duration = int(note_duration / time_per_tick)# 松开音符事件track.append(Message('note_off', note=note_number, velocity=64, time=tick_duration))# 保存MIDI文件
mid.save('warmup.mid')
  • 注意哼鸣练习中的 列表

    • 依然是 回文结构的

下载mid

图片描述

  • 在线编辑midi

    • https://midi-to-gcode.bambulab.com/edit

    • 选择 文件-打开

    • 打开 刚下好的mid文件

修改效果

  • 目前是 4/4 拍

    • 以 4分音符 为 1拍

    • 每小节 有 4拍

图片描述

  • 最后一个小节

    • 只有一个 四分音符

    • 应该是 全音符

    • 时长4拍

    • 独占一个小节

修改

图片描述

from mido import Message, MidiFile, MidiTrack# 创建一个新的MIDI文件和音轨
mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)# 定义C4对应的MIDI音符编号
c4_note = 60
# 定义除最后一个音符外其他音符的持续时间(这里设为0.5秒,可按需调整)
note_duration = 0.5
# 定义BPM(每分钟节拍数),控制节奏速度
bpm = 120
# 计算每拍对应的时间(秒)
tick_per_beat = mid.ticks_per_beat
time_per_beat = 60 / bpm
time_per_tick = time_per_beat / tick_per_beat# 定义“哆来咪发嗦发咪来哆”对应的音符偏移量
# 基于C4(60号音符),在C大调中,各音符偏移量对应关系
note_offsets = [0, 2, 4, 5, 7, 5, 4, 2, 0]# 遍历音符偏移量来添加音符事件到音轨
for i, offset in enumerate(note_offsets[:-1]):note_number = c4_note + offset# 按下音符事件track.append(Message('note_on', note=note_number, velocity=64, time=0))# 计算音符持续时间对应的tick数tick_duration = int(note_duration / time_per_tick)# 松开音符事件track.append(Message('note_off', note=note_number, velocity=64, time=tick_duration))# 处理最后一个音符(全音符,四拍)
last_offset = note_offsets[-1]
last_note_number = c4_note + last_offset
# 按下最后一个音符事件
track.append(Message('note_on', note=last_note_number, velocity=64, time=0))
# 全音符时长对应的tick数(四拍)
tick_duration_for_last = int(4 * time_per_beat / time_per_tick)
# 松开最后一个音符事件
track.append(Message('note_off', note=last_note_number, velocity=64, time=tick_duration_for_last))# 保存MIDI文件
mid.save('warmup2.mid')

配合

  • 演唱一下

图片描述

  • 可以让 开嗓midi越开越高吗?

图片描述

手动过程

  • 先复制一个开嗓 片段

图片描述

  • 然后将 片段 上移 一个半音

    • 得到 C#大调 的 哼鸣练习

图片描述

  • 这样 第二段哼鸣 就升高了半音

更多

  • 1段 变 2段

图片描述

  • 2段 变 4段

图片描述

  • 4段 变 8段

继续

  • 8段 变 16段

图片描述

  • 删除 其中3段

    • 还剩 13段

  • 从c开始

    • 到c结束

    • 开嗓

图片描述

  • 想用代码 实现这个mid

提问

图片描述

from mido import Message, MidiFile, MidiTrack# 基础参数
base_note = 60       # C4的MIDI音符编号(60对应C4)
note_offsets = [0, 2, 4, 5, 7, 5, 4, 2, 0]  # 123454321的音程偏移(C大调)
bpm = 120
ticks_per_beat = 480  # 可自定义MIDI精度
time_per_beat = 60 / bpm
time_per_tick = time_per_beat / ticks_per_beat
note_duration = 0.5   # 前8个音符时长(秒),最后一个音为4拍# 生成12个半音调的MIDI文件
for transpose in range(13):  # 0(原调)到12(升12半音)mid = MidiFile(ticks_per_beat=ticks_per_beat)track = MidiTrack()mid.tracks.append(track)# 添加调号(仅为示意,实际MIDI调号需用SysEx信息,此处通过音符移位实现)current_note = base_note + transpose  # 基础音升高transpose个半音for i, offset in enumerate(note_offsets):note_number = current_note + offset# 音符按下track.append(Message('note_on', note=note_number, velocity=64, time=0))# 计算时长(最后一个音为4拍)if i == len(note_offsets) - 1:tick_duration = int(4 * time_per_beat / time_per_tick)else:tick_duration = int(note_duration / time_per_tick)# 音符松开track.append(Message('note_off', note=note_number, velocity=64, time=tick_duration))# 保存文件(调名对应:C, C#, D, ..., B)sharps = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B', 'C'][transpose]mid.save(f'scale_{sharps}_major.mid')print(f"已生成 {sharps} 大调音阶 MIDI 文件")

文件

  • 生成了好多midi文件

图片描述

  • 大调 是啥意思?

总结🤔

  • 这次我们 制作了回文音符序列

    • 123454321

图片描述

  • 要整合成一个

    • 序列不断升级

      • 从c开始

      • 到c结束

图片描述

  • 可以整合吗?🤔

  • 下次再说 👋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950516.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctf简单出题流程

ctf简单出题流程 文件介绍 indexsrc 写一些题目的文件index.phpdockerfile 首先肯定是要安装好Docker的 Docker的流程网上有,这里就不再追述了 首先可以查看镜像 sudo docker images文件创建 我们可以在我们的/app…

2025年口碑好的连体雨衣厂家最新用户好评榜

2025年口碑好的连体雨衣厂家最新用户好评榜在当今快节奏的生活中,连体雨衣已成为户外工作者、骑行爱好者、建筑工人等群体的必备防护装备。随着消费者对产品质量和功能要求的不断提高,市场上涌现出一批以优质产品和卓…

体素化

from OCC.Core.STEPControl import STEPControl_Reader from OCC.Core.IFSelect import IFSelect_RetDone from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder from OCC.Core._BRepBndL…

2025年口碑好的四方立绒厂家推荐及选择指南

2025年口碑好的四方立绒厂家推荐及选择指南 四方立绒作为一种高档纺织面料,广泛应用于服装、家纺、装饰等领域,其柔软细腻的触感和优异的保暖性能深受市场青睐。随着消费者对品质要求的提升,选择一家口碑好、实力强…

吃数篇 酉鸡

做何呢?吃数篇 酉鸡 q:为什么不从day -2 开始写? a:懒。 其实总是会有一些想做的事因为各种各样原因没做。 不扯了,想看去鲜花吧(虽然目前没有,顺带一提,它没有也是这个原因)。 简单回顾day -2: 上午:赤石。 …

2025年十大哈尔滨工伤纠纷律师事务所哪家强

2025年十大哈尔滨工伤纠纷律师事务所哪家强在工伤纠纷领域,专业法律服务的需求日益增长。哈尔滨作为黑龙江省会城市,拥有众多专业律师事务所,为工伤受害者提供法律支持。工伤案件涉及复杂的法律程序和赔偿标准,选择…

Web信息的物联网设备指纹如何生成

当你家里的智能摄像头、路由器或者智能音箱连接到互联网时,它们是如何被准确识别出来的?就像每个人都有独一无二的指纹一样,物联网设备也有自己的“数字指纹”,帮助网络系统区分不同的设备。那么,Web信息的物联网…

跨网文件传输是什么?主要有哪几种应用场景?

跨网文件传输是现代信息技术中一个不可或缺的组成部分。它使得在不同网络环境之间,可以安全且高效地交换文件,满足了各行业对数据交换的迫切需求。无论是企业研发与办公网络之间的数据共享,还是金融行业对客户信息的…

Transformers 杂碎知识点

更新的步骤首先以某种方式计算出epoch,每个epoch包含steps_in_epoch 然后计算出total_updates,表示参数更新次数 接着取出batch_size个样本进行损失计算(各个样本以及各个设备会平均,最后得到的损失就像一个样本得…

对于每一个logger分别设置级别. 这样可以滤出来我们要的信息. logging里面有多个logger

对于每一个logger分别设置级别. 这样可以滤出来我们要的信息. logging里面有多个loggerimport logging as logginglogging.basicConfig(level=logging.INFO, # 修改日志级别format=%(asctime)s %(name)s [%(pathname)…

思维day2

思维day2P7150 [USACO20DEC] Stuck in a Rut S 题面 我们可以知道奶牛的轨迹是一条线。 首先我们注意到一个性质:每只奶牛只会被不同方向的奶牛所阻碍(x,y坐标各不相同)。 观察数据范围,我们发现只能从行进方向入手…

光纤数据收发加速计算卡设计方案:基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡

基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡 一、板卡概述 板卡采用Xilinx公司的XC7K325T-2FFG900I芯片作为主处理器,可应用于万兆网络、高速数据采集、存储;光纤隔离网闸等领域。 二、功能和技术指标:…

2025年比较好的纳米硅防火玻璃厂家实力及用户口碑排行榜

2025年比较好的纳米硅防火玻璃厂家实力及用户口碑排行榜 在建筑安全领域,防火玻璃的应用越来越广泛,尤其是在高层建筑、商业综合体、交通枢纽等场所,防火玻璃的性能直接关系到人员安全和财产保护。纳米硅防火玻璃凭…

Gitlens破解

Gitlens 破解本文来自博客园,作者:南宫影,转载请注明原文链接:https://www.cnblogs.com/nangongying/p/19175949

2025年口碑好的家装液压铰链厂家最新权威实力榜

2025年口碑好的家装液压铰链厂家最新权威实力榜在当今家装五金领域,液压铰链作为橱柜、衣柜等家具的核心部件,其品质直接影响着家具的使用寿命和用户体验。随着消费者对家居品质要求的不断提升,液压铰链市场也呈现出…

2025 年港澳台联考培训学校最新推荐榜,聚焦机构教学实力与升学成果深度剖析

引言 港澳台联考培训行业的规范发展与机构筛选,离不开科学权威的测评体系。本次推荐榜依托教育发展协会 2024 - 2025 年度港澳台联考培训行业测评数据编制,测评涵盖全国 32 个省市共 89 家正规培训机构。测评方法采用…

第09周 预习、实验与作业:Java集合框架

第09周 预习、实验与作业:Java集合框架第09周 预习、实验与作业:Java集合框架 目录第09周 预习、实验与作业:Java集合框架0.任务完成说明1.预习1.1 学习目标1.2 预习任务1.3 课前问题列表2.实验3.课后任务(作业)3…

文件摆渡系统品牌:Ftrans 如何成为银行业的最优选择

在数字经济时代,数据已成为银行业的核心生产要素。为防范网络攻击、数据泄露等风险,银行会将内部网络隔离为生产网、办公网、研发网等不同安全级别区域。但网络隔离后,“数据要流动”的业务需求并未消失,如何选择适…

powershell检查端口是否开放

来源:https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/test-connection?view=powershell-7.5

手把手教你用 Docker 部署 Red Hat UBI8 镜像

如果你需要一个“靠谱、安全、能长期用”的容器基础镜像,尤其是企业级场景(比如部署核心业务应用),UBI8 是首选之一。一、Red Hat UBI8 简介 Red Hat UBI8(Universal Base Image 8,通用基础镜像)是 Red Hat 官方…