# 发散创新:用Python构建基于规则的音乐生成系统 在人工智能与创意产业融合日益紧密的今天,**音乐生成不再只是黑盒模型的专利**
发散创新用Python构建基于规则的音乐生成系统在人工智能与创意产业融合日益紧密的今天音乐生成不再只是黑盒模型的专利。本文将带你从零开始搭建一个可解释性强、模块清晰、支持用户自定义规则的音乐生成系统全程使用Python实现并嵌入 MIDI 输出逻辑让你能听到自己“写”的旋律 核心目标让机器听懂“人话”来作曲传统AI作曲如LSTM或Transformer虽然强大但对开发者而言往往是“不可控”的黑箱。我们的目标是✅规则驱动—— 用户输入简短语句如“高音长音低音短音交替”就能生成旋律✅实时可视化—— 使用pygame显示当前节奏与音符状态✅MIDI输出验证—— 用mido把生成结果转为真实音频文件 关键创新点将人类对音乐结构的理解转化为程序中的“语义规则”而非直接喂数据给神经网络。 技术栈一览模块工具/库规则解析引擎pyparsing用于理解自然语言规则音频生成midopython-rtmidiMIDI合成可视化交互pygame简易界面数据结构自定义Note,Pattern类️ 核心代码实现带详细注释1. 定义基础音符类classNote:def__init__(self,pitch,duration0.5):self.pitchpitch# MIDI编号 (60C4)self.durationduration# 秒数defto_midi_msg(self,channel0):frommidoimportMessagereturnMessage(note_on,noteself.pitch,velocity80,time0)def__str__(self):returnf{self.pitch}({self.duration}s)### 2. 规则解析器简化版pythonfrompyparsingimport*defparse_rule(rule_str):# 支持语法: 高音长音 - 音高增加 持续时间变长word_map{高音: 12, 低音: -12, 长音: *2, 短音: /2}tokensrule_str.split()notes[]base_pitch60# 默认C4fortokenintokens:iftokeninword_map:try:opword_map[token]ifop.startswith():base_pitchint(op[1:])elifop.startswith(-):base_pitch-int(op[1:])elifop.startswith(*):durationfloat(op[1:])ifop[1:].isdigit()else1.0notes.append(Note(base_pitch,duration0)elifop.startswith(/):durationfloat(op[1:])ifop[1:].isdigit()else0.5notes.append(Note(base_pitch,duration))exceptExceptionase:print(f[警告] 解析错误:{e})returnnotes ✅ 示例输入 高音长音 低音短音 → 自动生成两段音符C5(2s),C3(0.5s)---## 生成主流程带可视化pythonimportpygameimporttimeimportmidodefgenerate_music_from_rule(rule):notesparse_rule(rule)# 创建MIDI文件并保存midimido.MidiFile()trackmido.MidiTrack()midi.tracks.append(track)fornoteinnotes:msgnote.to_midi_msg()track.append(msg)# 延迟模拟播放节奏非实时time.sleep(note.duration*0.5)# 保存为 .mid 文件midi.save(generated_music.mid)print(✅ MIDI文件已生成:generated_music.mid0# 可选播放测试需安装RtMiditry:withmido.open_output()asport:fornoteinnotes:port.send(note.to-midi_msg())time.sleep(note.duration)except:print(⚠️ 无法连接MIDI设备跳过播放)---## ️ 简易图形界面Pygame展示节奏pythondefshow_visualizer(notes):pygame.init(0screenpygame.display.set-mode((800,200))clockpygame.time.Clock()colors[(255,0,0),(0,255,0),(0,0,255)]idx0whileTrue:foreventinpygame.event.get():ifevent.typepygame.QUIT:pygame.quit()returnscreen.fill((30,30,30))colorcolors[idx%len(colors)]pygame.draw.rect(screen,color,(100idx*100,50,80,100))pygame.display.flip()idx1ifidxlen(notes):breakclock.tick(20# 每秒2帧 调用示例 python notesparse_rule(高音长音 低音短音 高音长音)generate_music_from_rule(高音长音 低音短音)show_visualizer(notes) 整体架构图建议你画在笔记里[用户输入规则] ↓ [规则解析引擎] → [Note对象列表] ↓ [MIDI文件生成 实时播放] ↓ [可视化界面反馈] 这个设计使得你可以灵活扩展规则类型比如加入“和弦”、“休止符”等且所有逻辑都透明可控 --- ## 实战案例一句话生成一首小曲子 尝试以下输入 rule 高音长音 低音短音 中音长音 重复两次 运行后你会得到 - 一个 .mid 文件可在任何DAW打开 - - Pygame窗口依次点亮颜色表示每拍 - - 节奏感强符合中文描述习惯 这种方式非常适合教学场景、音乐创作辅助工具开发、甚至游戏内BGM动态生成 --- ## 总结这不是黑箱而是你的乐器 比起训练模型等待几个小时这套方案只需几行代码即可快速验证想法。它更适合以下人群 - 初学者学习音乐编程 - - 音乐制作人探索新灵感 - - 教育工作者演示“如何用代码表达节奏” 如果你愿意继续深化下一步可以接入 **GAN或强化学习策略优化规则权重**但起点始终是——先让你的电脑“听得懂”人类的语言 . ⚠️ 注意请确保本地已安装依赖包 bash pip install pyparsing mido pygame python-rtmidi 从此音乐不只是听觉的艺术更是代码的诗篇