103用Python解码音乐奥秘!自然大调+钢琴结构+循环美学一次性掌握

103用Python解码音乐奥秘!自然大调+钢琴结构

c自然大调_开嗓音频_123454321_bpm

回忆

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

图片描述

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

图片描述

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

图片描述

  • 这有什么说法 呢?
八度
  • 观察 钢琴卷帘
  • 黑键 2个、3个 循环
  • 2个 像筷子
  • 3个 像叉子
  • 每组 循环
  • 叫做 1个 八度
  • octave

图片描述

  • 拢共 好几个八度
观察
  • 每个八度里面
  • 有​​12​​个音
  • 7个白键 + 5个黑键

图片描述

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

图片描述

代码
  • 复制代码
from mido import Message, MidiFile, MidiTrack, MetaMessage

def 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打开
  • Digital Audio Workstation(数字音频工作站)
  • windows - 水果flstudio
  • mac - 库乐队
  • 也可以在线编辑
结果
  • 在线编辑midi
  • 看到了 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, MetaMessage

base_note = 60       # C4
note_offsets = [0, 2, 4, 5, 7, 5, 4, 2, 0]  # 123454321音程
bpm = 120
ticks_per_beat = 480
time_per_beat = 60 / bpm
time_per_tick = time_per_beat / ticks_per_beat
note_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大调结束

图片描述

  • 这很像 衔尾蛇

图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值