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

  • 这很像 衔尾蛇

  • 绕了一圈 又回到了原点
  • 诗歌 里面也有这种 衔尾蛇 吗?🤔
  • 下次再说 👋
相关文章
|
5天前
|
机器学习/深度学习 人工智能 监控
翻墙、攀爬、跨越围栏等违规行为检测数据集(10,000 张图片已划分)—安全检测实践
本数据集包含10,000张标注图片,专注翻墙、攀爬等违规行为检测,适用于YOLOv8模型训练。涵盖工地、校园等多种场景,支持智能安防、视频分析等应用,助力构建高效安全监控系统。
翻墙、攀爬、跨越围栏等违规行为检测数据集(10,000 张图片已划分)—安全检测实践
|
6天前
|
网络协议 Linux Docker
Docker启动失败问题排查(一)
新公司切换至Windows环境后,Docker频繁启动失败,表现为引擎停止且图标无限加载。通过日志排查发现,问题源于Windows复杂网络配置导致Docker判断异常。最终通过分析`host`与`vm`目录下核心日志,定位并解决了网络服务初始化冲突问题。
130 4
|
16天前
|
机器学习/深度学习 运维 监控
别让运维只会“救火”——用数据点燃业务增长的引擎
别让运维只会“救火”——用数据点燃业务增长的引擎
84 12
|
6天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:十、开箱即见 Gradio:大模型的“魔法画布”,让每一个想法清晰可见
Gradio是一个快速构建机器学习演示界面的Python库,能够将需要数天开发工作的模型展示缩短为几分钟的脚本编写。它通过简单的Python代码即可生成完整的Web应用界面,支持文本、图像、音频等多种交互组件,适用于模型展示、教学演示和原型测试等场景。文章详细介绍了Gradio的核心功能、基础语法和组件使用方法,并通过情感分析和聊天机器人两个实际案例展示了如何快速部署AI模型交互界面。Gradio大幅降低了将模型转化为可交互应用的门槛,使开发者能更专注于模型本身而非界面开发。
136 7
|
3天前
|
数据采集 人工智能 缓存
构建AI智能体:十一、语义分析Gensim — 从文本处理到语义理解的奇妙之旅
Gensim是Python中强大的自然语言处理库,擅长从大量中文文本中自动提取主题、生成词向量并计算文档相似度。它支持LDA、Word2Vec等模型,结合jieba分词可有效实现文本预处理、主题建模与语义分析,适用于新闻分类、信息检索等任务,高效且易于扩展。
89 17
|
3天前
|
安全 NoSQL Java
微服务网关:你的系统不可或缺的“守门人”
微服务网关是系统的统一入口,解决多服务下的路由、鉴权、限流等问题。本文详解其核心功能、主流方案对比,并用Spring Cloud Gateway实战实现JWT鉴权与Redis限流,助你构建高效、安全的微服务架构。
117 11
|
3天前
|
JSON 前端开发 Java
一文彻底搞懂 @RequestBody 和 @RequestParam 的区别(附实战示例)
本文详解Spring Boot中@RequestBody与@RequestParam的核心区别,从请求格式、数据绑定到使用场景,结合代码示例解析常见误区,如参数接收失败、400错误等,并提供选择决策流程图,助你精准掌握RESTful接口开发要点。#SpringBoot #Java #API设计
155 11
|
6天前
|
人工智能 开发框架 自然语言处理
智能体来了!智能体教育新纪元:从黎跃春的智能体开发实训,看AI人才培养的未来路径
智能体时代来临,AI教育迈向“系统智能”新阶段。从零基础入门到项目实训,再到产教融合,培养具备AI思维与实战能力的创新型人才,推动教育与产业双向奔赴。
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:十二、给词语绘制地图:Embedding如何构建机器的认知空间
Embedding是一种将词语、图像等信息转化为低维稠密向量的技术,使计算机能捕捉语义关系。不同于传统One-Hot编码,Embedding通过空间距离表达语义相似性,如“国王-男人+女人≈王后”,广泛应用于NLP、推荐系统与大模型中,是AI理解世界的基石。
162 13