上次我们 制作了回文音符序列
123454321

要整合成一个
从c开始
到c结束
序列不断升级

可以整合吗?🤔
xstudio编辑13个小山峰

这有什么说法 呢?
八度观察 钢琴卷帘
<span style="background:black;color:white;">黑键</span> 2个、3个 循环
2个 像筷子
3个 像叉子
每组 循环
octave
叫做 1个 八度

拢共 好几个八度
观察每个八度里面
<span style="border:1px solid black;">7个白键</span> + <span style="background:black;color:white;">5个黑键</span>
有12个音

如果12个键 里面
只选择7个白键 就构成
C大调音阶
提问请帮我使用mido,生成一个 Python,运行后可以生成c大调音阶mid

复制代码
from mido import Message, MidiFile, MidiTrack, MetaMessagedef create_vocal_warmup_midi(output_file="C_major_scale.mid", tempo=500000, note_duration=500): # 创建 MIDI 文件和音轨 mid = MidiFile() track = MidiTrack() mid.tracks.append(track) # 设置速度(微秒/拍,默认中速) track.append(MetaMessage('set_tempo', tempo=tempo)) # 定义开嗓音阶(C大调音阶:C4到C5再下行,对应MIDI音符60-67-60) scale_notes = [60, 62, 64, 65, 67, 69, 71, 72] # 音符序列(C4, D4, E4, F4, G4, A4, B4, C5) # 生成音符事件 for note in scale_notes: # 音符开启(力度64) track.append(Message('note_on', note=note, velocity=64, time=0)) # 音符持续时间(以 ticks 为单位,需转换:1拍=480 ticks,假设4分音符为note_duration毫秒) ticks = int((note_duration / 1000) * (mid.ticks_per_beat)) # 音符关闭 track.append(Message('note_off', note=note, velocity=64, time=ticks)) # 保存 MIDI 文件 mid.save(output_file) print(f"MIDI 文件已生成:{output_file}")if __name__ == "__main__": create_vocal_warmup_midi()
粘贴并运行粘贴代码后
点击运行

右键文件可以下载到本地

可以用本地的DAW打开
windows - 水果flstudio
mac - 库乐队
Digital Audio Workstation(数字音频工作站)
也可以在线编辑
结果在线编辑midi
https://midi-to-gcode.bambulab.com/edit
看到了 c自然大调 音阶
C_major_scale
白键 一个不落

什么是 c自然大调 呢?
c自然大调使用 这个音程关系(全全半全全全半)
从c开始
到c结束

有什么特点呢?
音程关系自然大调
自然 就 符合规律
大调 就是 在调子里面
不跑调

c自然大调
1 = c
或 Do = c
写做

大调 可以
不从C 开始 吗?
更多大调选中 8个音符
将根音 从C
移动到G
得到 G自然大调
从 G开始
到 G结束
G、A、B、C、D、E、F、F#、G

音程 为 全全半全全全半
依旧自然
依旧不跑调
所以 同样是 自然大调音阶
根音在G的 自然大调
G自然大调
起始位置全全半全全全半的
自然大调音阶
从谁 开始都可以
只要保证 音节关系就可以

每八度 有 12个琴键
总共有 12种自然大调
要求
from mido import Message, MidiFile, MidiTrack, MetaMessagebase_note = 60 # C4note_offsets = [0, 2, 4, 5, 7, 5, 4, 2, 0] # 123454321音程bpm = 120ticks_per_beat = 480time_per_beat = 60 / bpmtime_per_tick = time_per_beat / ticks_per_beatnote_duration = 0.5 # 前8音时长,最后音4拍track_separator = int(2 * time_per_beat / time_per_tick) # 调间间隔2拍mid = MidiFile(ticks_per_beat=ticks_per_beat)track = MidiTrack()mid.tracks.append(track)# 添加速度控制(可选)track.append(MetaMessage('set_tempo', tempo=int(bpm * 500000 / 60))) # 转换为微秒/拍for transpose in range(13): # 升0~12半音(C4到C5) current_note = base_note + transpose for i, offset in enumerate(note_offsets): note_num = current_note + offset # 音符按下 track.append(Message('note_on', note=note_num, velocity=64, time=0)) # 计算时长 if i == len(note_offsets) - 1: tick_duration = int(4 * time_per_beat / time_per_tick) else: tick_duration = int(note_duration / time_per_tick) # 音符松开 track.append(Message('note_off', note_num, velocity=64, time=tick_duration)) # 调间间隔(2拍休止符) track.append(Message('note_off', note=0, velocity=0, time=track_separator)) # 空事件表示休止mid.save('all_scales_sequential.mid')print("合并后的MIDI文件已生成(同一音轨顺序演奏)")
歌词从南到北
海南渔舟荡舟渔南海台湾渔帆扬帆渔湾台云南普洱香洱普南云广西漓水清水漓江广广东粤茶香茶粤东广福建闽剧演剧闽建福贵州黔茶绿茶黔州贵湖南湘茶香茶湘南湖江西赣江流江赣西江浙江西湖美湖西江浙湖北黄鹤立鹤黄北湖安徽黄山秀山黄徽安江苏评弹唱弹评苏江四川蜀锦艳锦蜀川四重庆山城雾城山重川青海盐湖映湖海盐青甘肃祁连秀连祁肃甘陕西秦俑立俑秦西陕宁夏塞漠孤漠塞夏宁新疆胡杨挺杨胡疆新河南殷墟藏墟殷南河山东花生盛生花东山山西悬空寺空悬西山河北渤海涌海渤北河天津海河映河海津天京香山云绕云山香京内蒙草原牧原草蒙内辽宁辽塔耸塔辽宁辽吉林雾凇凝凇雾林吉龙江冰雕映雕冰江龙
如何改成从北到南?
歌词生成s = "海南渔舟荡舟渔南海台湾渔帆扬帆渔湾台云南普洱香洱普南云广西漓水清水漓江广广东粤茶香茶粤东广福建闽剧演剧闽建福贵州黔茶绿茶黔州贵湖南湘茶香茶湘南湖江西赣江流江赣西江浙江西湖美湖西江浙湖北黄鹤立鹤黄北湖安徽黄山秀山黄徽安江苏评弹唱弹评苏江四川蜀锦艳锦蜀川四重庆山城雾城山重川青海盐湖映湖海盐青甘肃祁连秀连祁肃甘陕西秦俑立俑秦西陕宁夏塞漠孤漠塞夏宁新疆胡杨挺杨胡疆新河南殷墟藏墟殷南河山东花生盛生花东山山西悬空寺空悬西山河北渤海涌海渤北河天津海河映河海津天京香山云绕云山香京内蒙草原牧原草蒙内辽宁辽塔耸塔辽宁辽吉林雾凇凝凇雾林吉龙江冰雕映雕冰江龙"print(s[::-1])
除了省
地级市
县城
也可以是

有点像 骨牌

并列且递进的感觉
13个山峰13个山峰
从C大调开始
到C#大调
再到D大调
12个琴键都做过大调的基音
回到C大调

回答最初
形成回环
动画电影就像电影最终
又回到了最开始的地方

这里是终点
这里也是起点
总结🤔从c大调开始
到c大调结束

这很像 衔尾蛇

绕了一圈 又回到了原点
诗歌 里面也有这种 衔尾蛇 吗?🤔
下次再说 👋