一个用于用遗传算法生成与评估简短旋律的 Python 项目。
- 旋律表示:固定长度 32 个槽(4 小节 × 4/4 × 八分音符分辨率)。每个槽为 MIDI 音高整数或
None表示休止。 - 遗传操作:交叉(单点、双点、均匀、按小节),变异(随机、节奏、局部)、移调、倒影、逆行等。
- 适应度指标:调性拟合、音程协和性、和弦兼容、避免重复、鼓励使用 HOLD、鼓励小节末休止等。
- 支持从文本文件加载种群、每代 JSONL 日志、MIDI 导出与播放(可选依赖
mido)。 - 支持每小节调性判断与评分(与整体调性一致性作为适应度的一部分)。
- 支持神经网络评分(BiGRU 回归器)并作为一个指标参与综合适应度。
- 支持保存并播放最佳旋律(保存为
.mid文件)。
src/melody.py:Melody数据类、解析/打印、MIDI 生成与播放、音名 ↔ MIDI 工具;提供保存并播放旋律的函数。src/operations.py:交叉、变异和变换算子实现。src/fitness.py:各类适应度函数与fitness_score的组合权重(DEFAULT_WEIGHTS);包含每小节调性评分与神经网络评分整合。src/ga.py:GeneticAlgorithm实现(选择、繁殖、日志、文件种群加载等)。src/machine_learning/nn_scorer.py:双向 GRU 回归器的训练与推理;训练日志打印每轮 MSE 与预测均值/标准差;保存权重到nn_scorer.pt。tests/:演示与测试脚本(如play_and_score.py,run_ga_from_file.py,test_melody.py)。
数据与目录结构(机器学习部分):
src/machine_learning/train/raw/:训练集 MIDI 文件src/machine_learning/val/raw/:验证集 MIDI 文件- 命名格式示例:
00001.mid、00002.mid…10381.mid为 train;10382.mid…11144.mid为 val - 其他:
split_summary.txt、track_role_accompaniment.csv等 CSV 标注/说明文件
可以选从music.txt中导入音乐,运行.\tests\run_ga_from_file.py,也可以随机产生20个片段,运行.\tests\run_ga_random20.py
在GA算法过程中,先根据f值保留若干个精英,然后用轮盘赌算法选两个父本,父本进化生成子代,现在具体写的策略是:
以一定概率直接复制父代
以一定概率父代进行交叉(共4种crossover形式)
综合适应度将多项指标加权融合,并支持神经网络评分作为一个指标参与融合;同时考虑每小节调性与整体调性的匹配情况。
要求:Python 3.8+
可选依赖(用于 MIDI 导出/播放):
python -m pip install mido python-rtmidi可选依赖(用于神经网络评分):
python -m pip install torch(如遇 OpenMP 运行时冲突,可在环境中设置线程数以降低风险:Windows CMD set OMP_NUM_THREADS=1,PowerShell $env:OMP_NUM_THREADS='1')
示例命令:
- 对一行旋律字符串进行评分并尝试播放:
python .\tests\play_and_score.py "C4 E4 G4 - C5 - ..."- 从
music.txt加载种群并运行 GA(脚本会把日志写为 JSONL):
python .\tests\run_ga_from_file.py- 随机片段并运行 GA(脚本会把日志写为 JSONL):
python .\tests\run_ga_random20.py- 运行内置测试/示例:
python .\tests\test_melody.py- 适应度权重(重要):在
src/fitness.py中的DEFAULT_WEIGHTS调整不同指标的重要性(包含nn_score的权重)。 - 进化概率:在
src/ga.py中通过改ga类中的概率实现,现在其实只用了一些基础的变换,operation.py中的很多操作还没有写进去(重点写了cross部分) - 其它默认参数:
population_size,generations,crossover_rate,mutation_rate,elitism,offspring_factor等。
- 文本种群加载要求每行至少包含 32 个 token(
0表示休止,-表示 HOLD,其他为音名如C4a#3,升降号就是#和b,写在中间)。项目会尝试按八度移位以容错超出音域的音符,但格式错误的行会被跳过。 - 若无法播放 MIDI,请确认
mido与平台后端已正确安装,或直接用系统播放器打开生成的.mid文件。 - 神经网络权重文件需位于
src/machine_learning/nn_scorer.pt,推理端使用state_dict加载(支持weights_only=True),并在fitness_score中以指标形式参与融合。目前已经事先训练好了nn_scorer.pt,使用者可以自行运行nn_scorer.py,再次训练模型。