- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将一系列音符(由时间、持续时间、音高定义)转换为音频文件。为此,我认为首先创建一个 midi 然后将其编译为 wav 是要走的路。
我对音频处理和 MIDI 文件很陌生,所以即使我阅读了几个教程,也可能我没有明白这一点。
编辑:我发现了问题,请参阅下面的解决方案。
有什么问题
通过 python 的 MIDIUtil
在特定时间以特定持续时间写笔记没有按预期工作。实际上,放置音符的时间(以秒为单位)在很大程度上取决于音轨的 bpm,尽管我认为在将音符时间转换为 MIDI 以四分音符为单位的时间度量时,我考虑了 bpm。
我试过的
我正在用给定的 bpm 创建一个 MIDI 轨道。
然后我通过转换笔记的事件时间t_{quarter} = t_{seconds} * bpm/60
示例
我正在使用以下代码编写两个注释,最后一个在 t=5 秒,持续时间为 1 秒;即我期待一个持续 6 秒的 midi 文件。但是在 bpm=600 时,文件的长度为 14 秒。在 bpm=100 时,几乎是预期的 6 秒。
这是我的代码
from midiutil import MIDIFile
def convert_seconds_to_quarter(time_in_sec, bpm):
quarter_per_second = (bpm/60)
time_in_quarter = time_in_sec * quarter_per_second
return time_in_quarter
def write_test_midi():
bpm = 600
MyMIDI = MIDIFile(1)
MyMIDI.addTrackName(track=0, time=0, trackName="Sample Track")
MyMIDI.addTempo(track=0, time=0, tempo=bpm)
MyMIDI.addNote(track=0, channel=0, pitch=60,
time=convert_seconds_to_quarter(1, bpm),
duration=convert_seconds_to_quarter(1, bpm), volume=100)
MyMIDI.addNote(track=0, channel=0, pitch=60,
time=convert_seconds_to_quarter(5, bpm),
duration=convert_seconds_to_quarter(1, bpm), volume=100)
with open("/tmp/output.mid", 'wb') as binfile:
MyMIDI.writeFile(binfile)
bpm=100
的文件的十六进制内容:
ADDRESS 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
00000010 4d 54 68 64 00 00 00 06 00 01 00 02 03 c0 4d 54 MThd..........MT
00000020 72 6b 00 00 00 0b 00 ff 51 03 09 27 c0 00 ff 2f rk......Q..'.../
00000030 00 4d 54 72 6b 00 00 00 28 00 ff 03 0c 53 61 6d .MTrk...(....Sam
00000040 70 6c 65 20 54 72 61 63 6b 8c 40 90 3c 64 8c 40 ple.Track.@.<d.@
00000050 80 3c 64 a5 40 90 3c 64 8c 40 80 3c 64 00 ff 2f .<d.@.<d.@.<d../
00000060 00 00 00 00 .
bpm=600
:
ADDRESS 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ASCII
00000010 4d 54 68 64 00 00 00 06 00 01 00 02 03 c0 4d 54 MThd..........MT
00000020 72 6b 00 00 00 0b 00 ff 51 03 01 86 a0 00 ff 2f rk......Q....../
00000030 00 4d 54 72 6b 00 00 00 29 00 ff 03 0c 53 61 6d .MTrk...)....Sam
00000040 70 6c 65 20 54 72 61 63 6b cb 00 90 3c 64 cb 00 ple.Track...<d..
00000050 80 3c 64 81 e1 00 90 3c 64 cb 00 80 3c 64 00 ff .<d....<d...<d..
00000060 2f 00 00 00 /.
最佳答案
第一个文件:
增量消息绝对时间
时间滴答秒
... 03 c0 ... 每四分音符 960 个刻度
... ff 51 03 09 27 c0 0 0 速度:每四分音符 600000 微秒
8c 40 90 3c 64 1600 1 注意
8c 40 80 3c 64 3200 2 音符
a5 40 90 3c 64 8000 5 注意
8c 40 80 3c 64 9600 6 音符
00 ff 2f 00 9600 6 轨道结束
第二个文件:
... 03 c0 ... 每四分音符 960 个刻度
... ff 51 03 01 86 a0 0 0 速度:每四分音符 100000 微秒
cb 00 90 3c 64 9600 1 注意
cb 00 80 3c 64 19200 2 注意
81 e1 00 90 3c 64 48000 5 注意
cb 00 80 3c 64 57600 6 注意
00 ff 2f 00 57600 6 轨道结束
这两个文件的长度正好是六秒。您的代码和文件是正确的。
问题是您用来处理文件的任何工具。
关于python - 通过 Python 在 Midi 的特定时间写笔记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60907934/
我需要(我必须)将大量 float 写入 qdatastream 并且我只使用 4 个字节是必要的。setFloatingPointPrecision 或为 float 和 double 写入 4 或
我有一些 C 代码,我用 Python 对其进行了扩展。扩展的 C 代码有一个将一些结构附加到二进制文件的函数: void writefunction(const struct struct1* so
我正在用 C 语言开发一个小软件,用于在布告栏中读取和写入消息。每条消息都是一个以渐进数字命名的 .txt。 软件是多线程的,有很多用户可以并发操作。 用户可以进行的操作有: 阅读整个公告板(所有 .
我有 2 个线程同时访问同一个大文件 (.txt)。 第一个线程正在从文件中读取。第二个线程正在写入文件。 两个线程都访问同一个 block ,例如(开始:0, block 大小:10),但具有不同的
我做了很多谷歌搜索,但我仍然不确定如何继续。 Linux 下最常见的剪贴板读写方式是什么?我想要同时支持 Gnome 和 KDE 桌面。 更新:我是否认为没有简单的解决方案,必须将多个来源(gnome
1. 定义配置文件信息 有时候我们为了统一管理会把一些变量放到 yml 配置文件中 例如 图片 用 @ConfigurationProperties 代替 @Value 使用方法 定义对应字段的实体
在开始之前,我必须先声明我是 FORTRAN 的新手。我正在维护 1978 年的一段遗留代码。它的目的是从文件中读取一些数据值,处理这些值,然后将处理过的值输出到另一个文本文件。 给定以下 FORTR
我正在制作一个应用程序,我需要存储用户提供的一些信息。我尝试使用 .plist 文件来存储信息,我发现: NSString *filePath = @"/Users/Denis/Documents/X
在delphi类中声明属性时是否可能有不同类型的结果? 示例: 属性月份:字符串读取monthGet(字符串)写入monthSet(整数); 在示例中,我希望在属性(property)月份中,当我:读
我正在以二进制形式将文件加载到数组中,这似乎需要一段时间有没有更好更快更有效的方法来做到这一点。我正在使用类似的方法写回文件。 procedure openfile(fname:string); va
我想实现一个运行模拟的C#控制台应用程序。另外,我想给用户机会在控制台上按“+”或“-”来加速/减速模拟的速度。 有没有办法在编写控制台时读取控制台?我相信我可以为此使用多线程,但是我却不怎么做(我对
这是我的代码: use std::fs::File; use std::io::Write; fn main() { let f = File::create("").unwrap();
我有一个应用程序可以访问 csv 文本文件中的单词。由于它们通常不会更改,因此我将它们放置在 .jar 文件中,并使用 .getResourceAsStream 调用读取它们。我真的很喜欢这种方法,因
我使用kubeadm,docker 17.12.1-ce和法兰绒网络安装了Kubernetes 1.13.1集群 但是,我发现Kubernetes主服务器上有许多空文件,权限为666,该文件允许任何用
我的工作区中有一些 java 文件。现在我想编写一个java程序,它可以读取来自不同源的文本文件,一次一个,一行一行,并将这些行插入到工作区中各自的java文件中。 文本文件会告诉我将哪个文件插入到哪
用户A要求系统读取文件foo,同时用户B想要将他或她的数据保存到同一个文件中。在文件系统级别如何处理这种情况? 最佳答案 大多数文件系统(但不是全部)使用锁定来保护对同一文件的并发访问。锁可以是独占的
我对保护移动应用程序的 firebase 数据库有一些疑问。 例如,在反编译Android应用程序后,黑客可以获取firebase api key 然后访问firebase数据库,这是正确的吗? 假设
我想让文件从外部不可删除,并希望使用java从程序对该文件进行读/写操作。 S0,我使用以下代码使用java创建了不可删除的文件: Process pcs = Runtime.getRunti
当 Selector.select() 以阻塞模式等待读/写操作时,是否可以将写消息推送到客户端?如何将选择器从阻塞模式移至写入模式?触发器可以是一个后台线程,用于放置需要写入给定 channel 的
我目前正在学习在 Linux 环境中使用 C 进行套接字编程。作为一个项目,我正在尝试编写一个基本的聊天服务器和客户端。 目的是让服务器为每个连接的客户端派生一个进程。 我遇到的问题是读取一个 chi
我是一名优秀的程序员,十分优秀!