Skip to content

Repository files navigation

Music_Math

一个用于用遗传算法生成与评估简短旋律的 Python 项目。

功能概览

  • 旋律表示:固定长度 32 个槽(4 小节 × 4/4 × 八分音符分辨率)。每个槽为 MIDI 音高整数或 None 表示休止。
  • 遗传操作:交叉(单点、双点、均匀、按小节),变异(随机、节奏、局部)、移调、倒影、逆行等。
  • 适应度指标:调性拟合、音程协和性、和弦兼容、避免重复、鼓励使用 HOLD、鼓励小节末休止等。
  • 支持从文本文件加载种群、每代 JSONL 日志、MIDI 导出与播放(可选依赖 mido)。
  • 支持每小节调性判断与评分(与整体调性一致性作为适应度的一部分)。
  • 支持神经网络评分(BiGRU 回归器)并作为一个指标参与综合适应度。
  • 支持保存并播放最佳旋律(保存为 .mid 文件)。

目录(重要文件)

  • src/melody.pyMelody 数据类、解析/打印、MIDI 生成与播放、音名 ↔ MIDI 工具;提供保存并播放旋律的函数。
  • src/operations.py:交叉、变异和变换算子实现。
  • src/fitness.py:各类适应度函数与 fitness_score 的组合权重(DEFAULT_WEIGHTS);包含每小节调性评分与神经网络评分整合。
  • src/ga.pyGeneticAlgorithm 实现(选择、繁殖、日志、文件种群加载等)。
  • 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.mid00002.mid10381.mid 为 train;10382.mid11144.mid 为 val
  • 其他:split_summary.txttrack_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,其他为音名如 C4 a#3,升降号就是 #b,写在中间)。项目会尝试按八度移位以容错超出音域的音符,但格式错误的行会被跳过。
  • 若无法播放 MIDI,请确认 mido 与平台后端已正确安装,或直接用系统播放器打开生成的 .mid 文件。
  • 神经网络权重文件需位于 src/machine_learning/nn_scorer.pt,推理端使用 state_dict 加载(支持 weights_only=True),并在 fitness_score 中以指标形式参与融合。目前已经事先训练好了 nn_scorer.pt,使用者可以自行运行 nn_scorer.py,再次训练模型。

About

the homework of Music_Math

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages