试听区(对比)
🔥 战损版试听 🔥
⚡ 医学奇迹版试听 ⚡
代码解剖室
🔧 战损版代码解剖室(高能预警)
安装夺命音效套件
# 当代刑具二件套
pip install numpy # 数学核弹头
pip install sounddevice # 声卡去世器
# 杀人音效三件套
import numpy as np # 数学武器库
import sounddevice as sd # 声卡摧毁者
# 玄学调参区(音乐老师看了会哭泣)
NOTE_FREQ = {
'C4': 261.63, # 中音do
'R': 0 # 休止符(其实根本停不下来)
# 此处省略一整个八度...
}
🎼 乐谱の暴力翻译(音乐生慎入)
score = [
# 前奏部分(程序员の脑补)
('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('E4', 1.5), # 你~会~唱~小~星~星~🎵
# 此处省略487个音符...
]
灵魂解读:
每个元组都是(音符, 时长)
的暴力映射,时长单位是拍子
用R代表休止符(但实际效果像卡痰)
🔊 声波生成黑科技(物理老师震怒)
def generate_tone(freq, duration, sample_rate=44100):
t = np.linspace(0, duration, int(sample_rate * duration)) # 时间轴
wave = 0.5 * np.sin(2 * np.pi * freq * t) # 纯净正弦波(才怪!)
return wave # 返回电子唢呐声
致命缺陷:
- 没有包络处理(音头音尾像被刀切)
- 单音色正弦波(堪比八位机音效)
- 音量恒定(听觉暴力美学)
🎹 暴力合成功夫(CPU:你不要过来啊!)
# 生成完整乐曲
sample_rate = 44100
audio = np.array([]) # 创建音频坟场
for note, duration in score:
freq = NOTE_FREQ[note]
tone = generate_tone(freq, duration, sample_rate) # 生成死亡音效
audio = np.concatenate([audio, tone]) # 强行拼接(产生爆音の奥秘)
sd.play(audio) # 发起声卡决斗
sd.wait() # 等待同归于尽
战损原理:
- 直接拼接导致波形不连续
- 没有淡入淡出处理
- 采样率粗暴固定
🔥 医学奇迹版代码解剖室(CPU临终关怀版)
# 音乐回魂三件套
pip install mido # MIDI招魂幡
pip install pygame # 声卡复活甲
pip install numpy # 玄学调参必备
🧬 MIDI基因编辑工程
import mido
import json
def serialize_message(msg):
"""MIDI解剖术(音乐老师の噩梦)"""
data = msg.dict()
data.pop('type', None) # 移除多余器官
data.pop('time', None) # 切除时间神经
if 'data' in data and isinstance(data['data'], bytes):
data['data'] = list(data['data']) # 把二进制切成香肠片
if 'text' in data:
# 用转义符给文字穿防弹衣
data['text'] = data['text'].encode('unicode_escape').decode('utf-8')
return json.dumps(data, ensure_ascii=False) # 做成音乐木乃伊
黑科技解读:
把MIDI消息变成JSON的过程,堪比把活鱼做成罐头——虽然还能吃,但灵魂已逝
🧿 音乐还魂大法
def export_midi(input_path, output_path):
mid = mido.MidiFile(input_path) # 打开音乐棺材
with open(output_path, 'w', encoding='utf-8') as f:
# 刻写墓志铭
f.write("[MIDI HEADER]\n")
f.write(f"type={mid.type}\n") # 音乐血型
f.write(f"ticks_per_beat={mid.ticks_per_beat}\n") # 心跳频率
f.write(f"track_count={len(mid.tracks)}\n\n") # 音轨数量
for track_idx, track in enumerate(mid.tracks):
f.write(f"[TRACK {track_idx}]\n") # 分尸标记
abs_time = 0
for msg in track:
abs_time += msg.time # 拼接时间尸体
prefix = "META" if msg.is_meta else "MSG"
# 将音乐灵魂封印进txt
f.write(f"{prefix}|{abs_time}|{msg.type}|{serialize_message(msg)}\n")
玄学原理:
把MIDI文件拆解成文本的过程,就像把钢琴拆成零件寄快递——能装回去算你赢
⚡ 硬件压力测试模块
def import_midi(input_path, output_path):
mid = MidiFile()
current_track = None
last_time = 0
with open(input_path, 'r', encoding='utf-8') as f:
for line in f:
if line.startswith("[MIDI HEADER]"):
# 注入音乐肾上腺素
mid.type = int(next(f).split("=")[1])
mid.ticks_per_beat = int(next(f).split("=")[1])
next(f) # 跳过无用的track_count(程序员の傲慢)
if line.startswith("[TRACK"):
current_track = MidiTrack() # 新开ICU病房
mid.tracks.append(current_track)
if '|' in line:
parts = line.split('|', 3)
# 展开时空折叠术
delta_time = abs_time - last_time
last_time = abs_time
# 执行音乐器官移植手术
try:
if prefix == "META":
msg = MetaMessage(...) # 拼接元数据假肢
else:
# 暴力数值整形(音乐整容术)
for field in ['channel', 'note']:
data[field] = int(data[field])
msg = Message(...) # 组装赛博义体
current_track.append(msg) # 完成音乐弗兰肯斯坦
医学奇迹:
这个逆向工程让MIDI文件实现了电子夺舍,虽然能播放但已经不再是原来的自己
🎯 祖传代码大放送(建议收藏刻墓碑)
第一版 战损音质
import numpy as np
import sounddevice as sd
# 定义音符频率(单位:Hz)
NOTE_FREQ = {
'C4': 261.63, 'D4': 293.66, 'E4': 329.63, 'F4': 349.23,
'G4': 392.00, 'A4': 440.00, 'B4': 493.88, 'C5': 523.25,
'D5': 587.33, 'E5': 659.26, 'F5': 698.46, 'G5': 784.00,
'A5': 880.00, 'B5': 987.77, 'C6': 1046.50,
'R': 0 # 休止符
}
# 定义歌曲《起风了》的简谱
score = [
# 前奏
('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('E4', 1.5),
('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('E4', 1.5),
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 1.5),
# 歌词部分
# 这一路上走走停停
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
('G4', 0.5), ('E4', 0.5),
# 顺着少年漂流的痕迹
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
('G4', 0.5), ('E4', 0.5), ('C4', 0.5),
# 迈出车站的前一刻
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
('D4', 0.5), ('C4', 0.5),
# 竟有些犹豫
('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不禁笑这近乡情怯
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
('D4', 0.5), ('E4', 0.5), ('E4', 0.5),
# 仍无可避免
('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('G4', 0.5), ('G4', 0.5), ('C4', 0.5),
# 而长野的天
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 依旧那么暖
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 风吹起了从前
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 从前初识这世间
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('D4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 万般流连
('C4', 0.5), ('D4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
# 看着天边似在眼前
('C4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('F4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 也甘愿赴汤蹈火去走它一遍
('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('D4', 0.5), ('G4', 0.5), ('G4', 0.5), ('C4', 0.5),
# 如今走过这世间
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('D4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 万般流连
('C4', 0.5), ('D4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
# 翻过岁月不同侧脸
('C4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('F4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 措不及防
('G4', 0.5), ('A4', 0.5), ('E4', 0.5), ('E4', 0.5),
# 闯入你的笑颜
('G4', 0.5), ('A4', 0.5), ('E4', 0.5), ('E4', 0.5), ('G4', 0.5), ('R', 0.5), ('A4', 0.5), ('A4', 0.5), ('R', 0.5),
# 我曾难自拔于世界之大
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('D4', 0.5),
# 也曾沉溺于其中梦话
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不得真假,不做挣扎
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不惧笑话
('D4', 0.5), ('E4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 我曾将青春翻涌成她
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('C4', 0.5),
# 也曾指尖弹出盛夏
('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5),
# 心之所动且就随缘去吧
('G4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('R', 0.5), ('D4', 0.5), ('C4', 0.5),
# 逆着光行走
('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5),
# 任风吹雨打
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 短短的路走走停停
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
# 也有了几分的距离
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不知抚摸的是故事
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
# 还是段心情
('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 也许期待的不过是
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('G4', 0.5), ('E4', 0.5),
# 与时间为敌
('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('G4', 0.5), ('G4', 0.5), ('C4', 0.5),
# 再次看到你
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 微凉的晨光里
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 笑得很甜蜜
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 从前初识这世间
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('D4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 万般流连
('C4', 0.5), ('D4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
# 看着天边似在眼前
('C4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('F4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 也甘愿赴汤蹈火去走它一遍
('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('D4', 0.5), ('G4', 0.5), ('G4', 0.5), ('C4', 0.5),
# 如今走过这世间
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('D4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 万般流连
('C4', 0.5), ('D4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
# 翻过岁月不同侧脸
('C4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('F4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5),
('G4', 0.5), ('A4', 0.5),
# 措不及防
('G4', 0.5), ('A4', 0.5), ('E4', 0.5), ('E4', 0.5),
# 闯入你的笑颜
('G4', 0.5), ('A4', 0.5), ('E4', 0.5), ('E4', 0.5), ('G4', 0.5), ('R', 0.5), ('A4', 0.5), ('A4', 0.5), ('R', 0.5),
# 我曾难自拔于世界之大
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('D4', 0.5),
# 也曾沉溺于其中梦话
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不得真假,不做挣扎
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不惧笑话
('D4', 0.5), ('E4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 我曾将青春翻涌成她
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('C4', 0.5),
# 也曾指尖弹出盛夏
('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5),
# 心之所动且就随缘去吧
('G4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('R', 0.5), ('D4', 0.5), ('C4', 0.5),
# 晚风吹起你鬓间的白发
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('D4', 0.5),
# 抚平回忆留下的疤
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 你的眼中明暗交杂
('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 一笑生花
('D4', 0.5), ('E4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 暮色遮住你蹒跚的步伐
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('D4', 0.5),
# 走进床头藏起的画
('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5),
# 画中的你低着头说话
('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('R', 0.5),
# 我仍感叹于世界之大
('C4', 0.5), ('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5),
# 也沉醉于儿时情话
('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5),
# 不剩真假
('G4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 不做挣扎
('D4', 0.5), ('E4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 无谓笑话
('D4', 0.5), ('E4', 0.5), ('R', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
# 我终将青春还给了她
('D4', 0.5), ('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('C4', 0.5),
# 连同指尖弹出的盛夏
('E4', 0.5), ('F4', 0.5), ('A4', 0.5), ('G4', 0.5), ('A4', 0.5), ('G4', 0.5),
# 心之所动就随风去了
('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('R', 0.5),
# 以爱之名你还愿意吗
('G4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5), ('E4', 0.5), ('D4', 0.5), ('C4', 0.5),
('R', 0.5), ('R', 0.5), ('R', 0.5), ('R', 0.5), ('R', 0.5), ('R', 0.5)
]
# 生成音频信号
def generate_tone(freq, duration, sample_rate=44100):
t = np.linspace(0, duration, int(sample_rate * duration))
wave = 0.5 * np.sin(2 * np.pi * freq * t)
return wave
# 生成完整乐曲
sample_rate = 44100
audio = np.array([])
for note, duration in score:
freq = NOTE_FREQ[note]
tone = generate_tone(freq, duration, sample_rate)
audio = np.concatenate([audio, tone])
# 播放音频
sd.play(audio, samplerate=sample_rate)
sd.wait() # 等待播放完成
第二版 奇迹版
#生成txt数据
import mido
import json
def serialize_message(msg):
"""安全序列化MIDI消息"""
data = msg.dict()
# 移除冗余字段
data.pop('type', None)
data.pop('time', None)
# 处理二进制数据
if 'data' in data and isinstance(data['data'], bytes):
data['data'] = list(data['data'])
# 处理文本编码
if 'text' in data:
data['text'] = data['text'].encode('unicode_escape').decode('utf-8')
return json.dumps(data, ensure_ascii=False)
def export_midi(input_path, output_path):
mid = mido.MidiFile(input_path)
with open(output_path, 'w', encoding='utf-8') as f:
# 文件头
f.write("[MIDI HEADER]\n")
f.write(f"type={mid.type}\n")
f.write(f"ticks_per_beat={mid.ticks_per_beat}\n")
f.write(f"track_count={len(mid.tracks)}\n\n")
# 处理音轨
for track_idx, track in enumerate(mid.tracks):
f.write(f"[TRACK {track_idx}]\n")
abs_time = 0
for msg in track:
abs_time += msg.time
prefix = "META" if msg.is_meta else "MSG"
msg_data = serialize_message(msg)
f.write(f"{prefix}|{abs_time}|{msg.type}|{msg_data}\n")
f.write("\n")
if __name__ == "__main__":
export_midi('input.mid', 'midi_content.txt')
#播放txt音频
import json
import mido
from mido import MidiFile, MidiTrack, Message, MetaMessage
import pygame
import time
def parse_message(data_str):
"""反序列化消息数据"""
data = json.loads(data_str)
# 恢复二进制数据
if 'data' in data and isinstance(data['data'], list):
data['data'] = bytes(data['data'])
# 恢复文本编码
if 'text' in data:
data['text'] = bytes(data['text'], 'utf-8').decode('unicode_escape')
return data
def import_midi(input_path, output_path):
mid = MidiFile()
current_track = None
last_time = 0
with open(input_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line:
continue
# 处理文件头
if line.startswith("[MIDI HEADER]"):
mid.type = int(next(f).split("=")[1])
mid.ticks_per_beat = int(next(f).split("=")[1])
next(f) # 跳过track_count
continue
# 新建音轨
if line.startswith("[TRACK"):
current_track = MidiTrack()
mid.tracks.append(current_track)
last_time = 0
continue
# 解析消息行
if '|' in line:
parts = line.split('|', 3)
prefix, abs_time, msg_type, msg_data = parts
abs_time = int(abs_time)
# 计算相对时间
delta_time = abs_time - last_time
last_time = abs_time
# 反序列化数据
data = parse_message(msg_data)
# 创建消息对象
try:
if prefix == "META":
msg = MetaMessage(type=msg_type, time=delta_time, **data)
else:
# 强制转换数值类型
int_fields = ['channel', 'note', 'velocity', 'control',
'value', 'program', 'pitch']
for field in int_fields:
if field in data:
data[field] = int(data[field])
msg = Message(type=msg_type, time=delta_time, **data)
current_track.append(msg)
except Exception as e:
print(f"消息解析失败: {line}")
print(f"错误详情: {str(e)}")
mid.save(output_path)
return mid
def play_midi(midi_path):
pygame.mixer.init()
pygame.mixer.music.load(midi_path)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(0.1)
print("播放完成")
if __name__ == "__main__":
rebuilt = import_midi('midi_content.txt', 'rebuilt.mid')
play_midi('rebuilt.mid')
🤔 听力理解必考题(单选)
-
战损版x分x秒的"滋滋"声其实是:
A) 宇宙背景辐射
B) 显卡计算圆周率
C) 隔壁WIFI密码
D) 声卡的SOS摩斯电码
-
医学奇迹版让CPU温度飙升的元凶是:
A) 量子波动读取
B) MIDI转码の信仰之力
C) 硅晶体の哭泣
D) 散热膏过期
-
程序员坚持写完这代码的动力是:
A) 对音乐的热爱
B) 想换新电脑的阴谋
C) 甲方需求
D) 网吧充值送的时间用不完
(答案在代码第π行,反正没人会看)
🔥 考点精要(挂科重点)
- 正弦波的暴力美学:用
np.sin
创造电子噪音
- MIDI的赛博夺舍:
json
实现音乐借尸还魂
- 硬件谋杀三连:
numpy
+sounddevice
+pygame
- 程序员の听力损伤程度与代码复杂度成正比
🤖 硬件の临终关怀(附赠运行后果)
显卡燃烧.gif
声卡去世.jpg
🎛 对比实验报告
玄学指标 |
战损版 |
医学奇迹版 |
代码暴力指数 |
徒手拆高达 |
用高达零件拼变形金刚 |
CPU心理阴影 |
被要求做小学数学 |
被迫证明黎曼猜想 |
声卡体验 |
被AK47扫射 |
被绑在火箭推进器上 |
代码可读性 |
意大利面代码 |
量子波动速读代码 |
适合人群 |
想换新电脑的穷学生 |
想测试电源功率的极客 |
🤖 硬件の临终关怀(附赠运行后果)
显卡燃烧.gif
声卡去世.jpg
📜 宇宙终极免责声明
运行本代码即视为同意以下条款:
- 您的主板将获得电子往生服务
- 您的耳机自动加入受害者联盟
- 您同意向电力公司支付信仰税
- 您承认这是2025年最野的代码
- 运行前请签订《器官捐献协议》(耳朵使用权可能永久丧失)
- 第二版不是没爆音,只是被风扇噪音盖过去了
- 若出现花屏/死机/灵异现象,那是代码在表演电子招魂