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

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

c自然大调_开嗓音频_123454321_bpm

回忆

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

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

  • 可以整合吗?🤔

xstudio编辑

  • 13个小山峰

  • 这有什么说法 呢?

八度

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

  • 拢共 好几个八度

观察

  • 每个八度里面
  • 12个音
  • <span  style="border:1px solid black;">7个白键</span> + <span  style="background:black;color:white;">5个黑键</span>

  • 如果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大调结束

  • 这很像 衔尾蛇

  • 绕了一圈 又回到了原点
  • 诗歌 里面也有这种 衔尾蛇 吗?🤔
  • 下次再说 👋
相关文章
|
存储 监控 C语言
西门子S7-1200编程实例,关断延迟定时器指令如何使用?
在西门子S7-1200中有四种类型的定时器:TON接通延迟定时器、TONR保持型接通延迟定时器、TOF关断延迟定时器、TP脉冲定时器。
西门子S7-1200编程实例,关断延迟定时器指令如何使用?
|
9月前
|
Linux iOS开发 UED
计算机三大操作系统
Windows、macOS与Linux,三大操作系统背后是三种哲学:实用兼容、极致体验与自由开源。它们代表不同的价值观——包容大众、追求精致或掌控技术,塑造了数字世界的多元生态。选择系统,即是选择生活方式。
|
测试技术 API Python
Appium控件交互策略:优化自动化测试效率的关键方法
该文介绍了如何使用Selenium与APP进行交互,包括点击、输入和状态判断等操作。例如,通过element.click()点击控件,element.send_keys()输入文本,以及element.is_displayed()检查元素是否可见。还展示了如何获取元素属性,如resource-id、text和class,并提供了Python代码示例来定位并操作APP元素,如滑动条的显示、可点击性检测及点击滑动条中心位置。在编写测试脚本时,应注意元素定位和状态验证以确保测试稳定性。
|
12月前
|
JSON 自然语言处理 搜索推荐
银行卡归属地及开户行查询API查询实战指南
银行卡归属地及开户行查询API,通过卡号快速识别发卡行、开户地及卡种信息,支持全国1500+银行,数据实时更新。提供结构化数据返回,广泛应用于支付、风控、用户画像等场景,助力金融系统高效、安全运行。
3885 9
|
9月前
|
弹性计算 运维 安全
ECS还是轻量应用服务器,有什么区别?看完评测你就知道了!
阿里云ECS与轻量应用服务器有何区别?ECS适合企业级高负载场景,功能全面、灵活扩展;轻量服务器基于ECS优化,门槛低、易运维,适合个人开发者搭建博客、测试环境等轻量应用。从镜像、网络、计费到使用限制,本文全面对比二者差异,助你按需选择。
|
9月前
|
Web App开发 存储 人工智能
Web-Dev-For-Beginners:微软开源的 Web 开发课程,值得花 3 个月认真学
微软开源的 Web 开发课程,12 周讲解 HTML/CSS/JavaScript。通过 6 个实战项目(植物园、打字游戏、浏览器扩展、太空游戏、银行应用、代码编辑器)掌握前端技能。配套 48 个测验,适合零基础,学完产出完整作品集。
|
应用服务中间件 nginx 缓存
一文掌握 Nginx 反向代理:从入门到生产级配置
本文全面解析Nginx反向代理,涵盖基础概念、负载均衡策略、SSL终止、缓存、安全防护及生产级配置,助你从入门到精通,构建高性能、高可用的Web架构。
1885 1
|
10月前
|
索引 Python
098-python列表_切片_slice_开始_结束
本文介绍了Python中列表的切片(slice)操作,通过“前闭后开”原则截取列表片段,支持正负索引、省略端点等用法,并结合生活实例(如切面包、直播切片)帮助理解。切片不改变原列表,返回新列表。
491 4
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
698 0
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
1744 1
MySQL常见问题解决和自动化安装脚本