Skip to content

This is the "fantastic-idea" project for ACES 2025 Annual Conference, which generates a song based on the input C program.

Notifications You must be signed in to change notification settings

wzyb-52/Code2Music

Repository files navigation

Code2Music - 代码转音乐可视化系统

将源代码转换为音乐并进行可视化展示的创新项目。支持 C 和 Python,生成 Alda 乐谱、MIDI、MP3 和可视化数据。

🎵 快速开始(两步走)

第一步:生成音乐数据

# 安装依赖
uv sync

# 从代码文件生成音乐(导出所有格式包括可视化 JSON)
uv run python -m code_composer -f examples/fibonacci.c --export-all -o output/music

# 生成文件:
# - output/music.alda (Alda 乐谱)
# - output/music.mid (MIDI 文件)
# - output/music.mp3 (音频文件)
# - output/music.json (可视化数据) ← 重要!

第二步:运行可视化前端

cd code2music-visualizer
npm install
npm run dev

然后在浏览器中:

  1. 打开 http://localhost:5173
  2. 点击 "Choose File" 选择生成的 JSON 文件(如 output/music.json
  3. 点击播放按钮,享受代码变音乐的视觉盛宴!

特性

🎼 音乐生成

  • 🎼 多语言支持(C、Python)
    • C 编译器:使用 pycparser 进行完整的 C99 代码解析和 AST 转换
    • Python 编译器:基于标准库 tokenize 模块
  • 🎵 自动生成钢琴乐谱(旋律+和弦伴奏)
  • 🎹 多种音乐风格(Default、Jazz、Waltz、Minuet、Gypsy、Arabic、Gothic、Chinese、Xinjiang)
  • 🎼 支持和声进行和旋律生成
  • 📁 导出格式:Alda、MIDI、MP3、JSON(可视化数据)
  • 🔊 自动播放(使用 Alda)
  • 🔊 无需外部 SoundFont(使用 timidity 内置音色)

🎨 可视化界面

  • 五线谱实时显示
    • 高音谱号 (𝄞) - 青色,显示旋律音符 (V1)
    • 低音谱号 (𝄢) - 洋红色,显示低音音符 (V2)
    • 激活线 - 虚线标记,音符到达此处时高亮显示
    • 扩展谱线 - 浅色辅助线显示更大音域范围
  • 霓虹风格设计
    • 音符带发光效果
    • 不同代码元素使用不同颜色(关键字、标识符、数字、字符串、运算符等)
  • 交互功能
    • 悬停提示 - 查看音符详细信息
    • 智能标签 - 仅在激活或悬停的音符上显示
    • 最小化 HUD - 显示播放时间、速度和拍号

快速开始

环境配置

系统工具

# macOS
brew install alda timidity ffmpeg

# Linux
sudo apt-get install alda timidity ffmpeg

Nix 用户

项目包含 shell.nix.envrc 配置,含有 alda timidity ffmpeg 以及 uv 等系统软件,Nix 用户可以直接使用:

# 使用 direnv(推荐)
direnv allow

# 或者手动进入 Nix shell
nix-shell

Python 包

uv sync

最快试听(推荐)

# 直接在终端听音乐,无需保存文件
uv run python -m code_composer -c "int x = 42;"

保存 MP3

# 从 C 代码文件生成
uv run python -m code_composer -f code.c -o music --no-play

# 从 Python 代码文件生成
uv run python -m code_composer -f code.py -o music --no-play

# 从字符串生成
uv run python -m code_composer -c "int x = 42;" -o music --no-play

CLI 使用指南

所有命令都需要加 uv run python 前缀。例如:

uv run python -m code_composer [选项]

基本用法

# 快速试听(生成但不保存文件)
uv run python -m code_composer -c "int x = 42;"

# 从 C 文件生成 MP3 并保存(会自动播放)
uv run python -m code_composer -f code.c -o output/music

# 从 Python 文件生成 MP3 并保存(会自动播放)
uv run python -m code_composer -f code.py -o output/music

# 生成但不播放
uv run python -m code_composer -f code.c -o output/music --no-play

# 使用不同音阶(自动选择推荐和声进行)
uv run python -m code_composer -c "int x = 42;" --key D --scale minor

# 指定音阶和和声进行
uv run python -m code_composer -f code.c --key G --scale dorian --chord 1min-4-1min-4

完整命令选项

可以用下面的命令打印完整的选项列表:

uv run python -m code_composer --help
options:
  -h, --help            show this help message and exit
  -f, --file FILE       输入源代码文件路径(支持 .c 和 .py)
  -c, --code CODE       直接传入源代码字符串
  --lang {c,python,auto}
                        源代码语言(默认自动判断)
  --key KEY             乐曲调(如 C, G, D#, Bb,默认使用风格的默认值)
  --scale SCALE         音阶/调式(默认使用风格的默认值,可用: major, minor, harmonic_minor, melodic_minor, dorian, phrygian, lydian,
                        mixolydian, pentatonic_major, pentatonic_minor, chinese_pentatonic, blues, gypsy_minor,
                        gypsy_major, hijaz, hijaz_kar, bayati, nahawand, kurd, rast, saba, xinjiang_minor,
                        xinjiang_major, xinjiang_aug, japanese_pentatonic, miyako_bushi, ritsu, minyo,
                        russian_folk_minor, russian_folk_major, soviet_march)
  --test-scale          测试模式:只播放当前音阶(覆盖2个八度),不生成旋律
  --test-chord          测试模式:只播放当前和声进行(分解和弦),不生成旋律
  -o, --output OUTPUT   输出文件名(不含扩展名)或路径。如不指定则只播放不保存
  --chord CHORD         和声进行(不指定则根据音阶自动选择推荐进行)
  --style STYLE         音乐风格(可用: default, minuet, test, waltz, jazz, gypsy, arabic, gothic, japanese, classic,
                        chinese, soviet, xinjiang)
  --tempo TEMPO         乐曲速度 BPM(默认:120,waltz/minuet 为 160)
  --bass-pattern {arpeggio,block,walking,pendulum,pop,marching,double,waltz_oom_pah,ostinato}
                        低音模式(默认使用风格的低音模式)
  --bars-per-phrase BARS_PER_PHRASE
                        每个乐句的小节数(默认:4)
  --bars-per-token {1,2}
                        一个 token 覆盖的小节数(1 或 2,默认 1)
  --seed SEED           随机数种子(默认:42,用于复现结果)
  --parts {melody,bass,both}
                        输出部分:melody(仅旋律 V1)bass(仅低音 V2)both(两者,默认)
  -v, --verbose         显示详细输出信息
  --debug               生成后打印作品的树形结构信息
  --no-play             生成后不自动播放音乐
  --ignore-bad          忽略不和谐和弦变体
  --instrument INSTRUMENT
                        使用的乐器
  --version             show program's version number and exit

更多用法

指定风格、调式与和弦:

uv run python -m code_composer -f code.c --style jazz --key G --scale dorian --chord 2min-5-1 --tempo 140

生成所有格式(Alda + MIDI + MP3):

uv run python -m code_composer -f code.c --export-all -o output/complete_music

不自动播放:

uv run python -m code_composer -f code.c -o music --no-play

自动播放说明

  • 默认自动播放生成的音乐(通过 Alda)
  • 如果不指定 -o 参数,生成后播放但不保存文件
  • 使用 --no-play 禁用自动播放

音乐风格系统

Code Composer 支持基于外部配置文件的预设音乐风格!每个风格都有独特的节奏型和特色。

TODO: 风格配置文档

完整的预设风格配置文件可以在 目录下看到。

Python API(高级)

Code Composer 可以作为一个 Python 库使用,方便自定义作曲流程。

最简单的编译代码,参见

"""
Code Composer 使用示例
"""

from code_composer.composer import compose
from code_composer.exporter import export_to_midi, midi_to_mp3
from code_composer.frontend.c import compile_c_code
from code_composer.styles import get_style

# 示例 1:Fibonacci 数列
fibonacci_code = """
int fibonacci(int n) {
    if (n <= 1) return n;
    return fibonacci(n-1) + fibonacci(n-2);
}

int main() {
    int result = fibonacci(10);
    return 0;
}
"""

if __name__ == "__main__":
    # 转换为 MP3
    alda_file = './out.alda'
    midi_file = './out.midi'
    mp3_file = './out.mp3'

    # 获取 Style 并编译源码
    style_obj = get_style("default")
    tokens = compile_c_code(fibonacci_code)
    alda_score, metadata, comp = compose(
        style=style_obj,
        tokens=tokens,
    )

    # 保存 Alda 文件
    with open(alda_file, 'w') as f:
        f.write(alda_score)

    # 导出 MIDI
    export_to_midi(alda_file, midi_file)

    # 导出 MP3
    midi_to_mp3(midi_file, mp3_file)

编译流程

  • Compiler or Composer?
  • Compiler is Composer!
源代码 (.c / .py)
       |
       v
[Frontend 前端模块]
  ├─ c.py (pycparser)   → 解析 C 代码
  ├─ python.py (tokenize) → 解析 Python 代码
  └─ lexer.py (通用接口)  ← 统一的 Token 输出
       |
       v
  统一的 Token 流
       |
       v
[Composer 谱曲引擎]
  ├─ 风格系统
  ├─ 节奏型选择
  ├─ 和弦进行
  └─ 旋律生成
  └─ 伴奏生成
       |
       v
  Alda 乐谱
       |
   ┌───┴───┐
   v       v
  MIDI    MP3

前端模块

frontend/ 目录统一管理所有语言的解析器:

  • lexer.py - 定义通用接口

    • TokenType - Token 类型枚举
    • Token - Token 数据结构
    • BaseLexer - 基础词法分析器接口
  • c.py - C 语言前端

    • 使用 pycparser 进行完整 C99 解析
    • AST 转换为 Token 流
  • python.py - Python 语言前端

    • 使用标准库 tokenize 模块
    • 处理 Python 代码的语法糖

所有前端都输出统一格式的 Token 列表,便于谱曲器后续处理。

许可证

MIT

About

This is the "fantastic-idea" project for ACES 2025 Annual Conference, which generates a song based on the input C program.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •