- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 pyaudio 演奏和弦?
最佳答案
当然可以!
只需生成结果并将其传递给播放器即可。
This article covers a method to do it.
以下是示例代码,以防链接中的文章发生更改或失效:
import math
import numpy
import pyaudio
import itertools
from scipy import interpolate
from operator import itemgetter
# https://davywybiral.blogspot.com/2010/09/procedural-music-with-pyaudio-and-numpy.html
class Note:
NOTES = ['c','c#','d','d#','e','f','f#','g','g#','a','a#','b']
def __init__(self, note, octave=4):
self.octave = octave
if isinstance(note, int):
self.index = note
self.note = Note.NOTES[note]
elif isinstance(note, str):
self.note = note.strip().lower()
self.index = Note.NOTES.index(self.note)
def transpose(self, halfsteps):
octave_delta, note = divmod(self.index + halfsteps, 12)S
return Note(note, self.octave + octave_delta)
def frequency(self):
base_frequency = 16.35159783128741 * 2.0 ** (float(self.index) / 12.0)
return base_frequency * (2.0 ** self.octave)
def __float__(self):
return self.frequency()
class Scale:
def __init__(self, root, intervals):
self.root = Note(root.index, 0)
self.intervals = intervals
def get(self, index):
intervals = self.intervals
if index < 0:
index = abs(index)
intervals = reversed(self.intervals)
intervals = itertools.cycle(self.intervals)
note = self.root
for i in range(index):
note = note.transpose(next(intervals))
return note
def index(self, note):
intervals = itertools.cycle(self.intervals)
index = 0
x = self.root
while x.octave != note.octave or x.note != note.note:
x = x.transpose(next(intervals))
index += 1
return index
def transpose(self, note, interval):
return self.get(self.index(note) + interval)
def sine(frequency, length, rate):
length = int(length * rate)
factor = float(frequency) * (math.pi * 2) / rate
return numpy.sin(numpy.arange(length) * factor)
def shape(data, points, kind='slinear'):
items = points.items()
sorted(items,key=itemgetter(0))
keys = list(map(itemgetter(0), items))
vals = list(map(itemgetter(1), items))
interp = interpolate.interp1d(keys, vals, kind=kind)
factor = 1.0 / len(data)
shape = interp(numpy.arange(len(data)) * factor)
return data * shape
def harmonics1(freq, length):
a = sine(freq * 1.00, length, 44100)
b = sine(freq * 2.00, length, 44100) * 0.5
c = sine(freq * 4.00, length, 44100) * 0.125
return (a + b + c) * 0.2
def harmonics2(freq, length):
a = sine(freq * 1.00, length, 44100)
b = sine(freq * 2.00, length, 44100) * 0.5
return (a + b) * 0.2
def pluck1(note):
chunk = harmonics1(note.frequency(), 2)
return shape(chunk, {0.0: 0.0, 0.005: 1.0, 0.25: 0.5, 0.9: 0.1, 1.0:0.0})
def pluck2(note):
chunk = harmonics2(note.frequency(), 2)
return shape(chunk, {0.0: 0.0, 0.5:0.75, 0.8:0.4, 1.0:0.1})
def chord(n, scale):
root = scale.get(n)
third = scale.transpose(root, 2)
fifth = scale.transpose(root, 4)
return pluck1(root) + pluck1(third) + pluck1(fifth)
root = Note('A', 3)
scale = Scale(root, [2, 1, 2, 2, 1, 3, 1])
chunks = []
chunks.append(chord(21, scale))
chunks.append(chord(19, scale))
chunks.append(chord(18, scale))
chunks.append(chord(20, scale))
chunks.append(chord(21, scale))
chunks.append(chord(22, scale))
chunks.append(chord(20, scale))
chunks.append(chord(21, scale))
chunks.append(chord(21, scale) + pluck2(scale.get(38)))
chunks.append(chord(19, scale) + pluck2(scale.get(37)))
chunks.append(chord(18, scale) + pluck2(scale.get(33)))
chunks.append(chord(20, scale) + pluck2(scale.get(32)))
chunks.append(chord(21, scale) + pluck2(scale.get(31)))
chunks.append(chord(22, scale) + pluck2(scale.get(32)))
chunks.append(chord(20, scale) + pluck2(scale.get(29)))
chunks.append(chord(21, scale) + pluck2(scale.get(28)))
chunk = numpy.concatenate(chunks) * 0.25
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=1)
stream.write(chunk.astype(numpy.float32).tostring())
stream.close()
p.terminate()
和here是更好的来源
关于python - pyaudio 可以同时播放两个音符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001846/
基本上,我想在音序器播放时实时获取并显示 MIDI 音符(轨道、音符和 Octave )的数据。 我希望能够将其添加到以下代码中: Sequencer sequencer = MidiSystem.g
播放我使用的是 AVAudioUnitSampler: sampler.stopNote(note, onChannel: channel) 但要停止我不想使用:
一个接一个地弹奏音符的最佳方式是什么?这是我现在拥有的最实用的代码。 let majorScale = [60, 62, 64, 65, 67, 69, 71, 72] for i i
我正在尝试构建一个程序,使用 Java Sound API (javax.sound.midi) 在合成器播放时在屏幕上显示 MIDI 音符。 MIDI 文件需要从磁盘加载,但我在将音序器连接到合成器
我已经搜索过并且已经完成了一个可以播放 MIDI 音符的 OS X 应用程序,但是当我在 iOS 中尝试时,没有任何反应。这是核心代码: AUGraph graph; AudioUnit synthU
我正在开发一个 iOS 音乐应用程序(用 C++ 编写),我的模型看起来或多或少像这样: --Song ----Track ----Track ------Pattern ------Pattern
我正在尝试构建一个系统,该系统将能够处理某人吹口哨的记录并输出注释。 谁能推荐一个开源平台,我可以将其用作音符/音高识别和波形文件分析的基础? 提前致谢 最佳答案 正如其他许多人已经说过的那样,FFT
我正在尝试使用 AUSampler 音频单元 在 sf2 文件的帮助下播放 midi 音符。我能够使用 MusicDeviceMIDIEvent 函数开始和停止音符,如下所示。 noteCommand
我需要在我的应用中同时播放多个轨道。音轨可以是普通音频文件或一组 MIDI 音符。因此,我配置了音频图并将各种音频单元(文件播放器 AU 和采样器 AU)连接到多 channel 混音器,其输出连接到
我正在开发一个适用于 iOS 的琶音器应用程序,它能够将无限的音符序列发送到外部 MIDI 兼容的硬件合成器。我使用 AudioKit 来接收和发送 MIDI 信息。 我的工作室设置包括 E-RM 多
我正在对一种似乎是带有音色库的 MIDI 的音乐格式进行逆向工程。 但是我无法使我的实现听起来正确,因为我不知道如何以给定的 MIDI 音符播放音库中的样本(我只是以它们的原始 khz 播放它们)。
澄清一下:我不想生成 MIDI 文件,也不想播放 MIDI 文件,我希望即时播放 MIDI 音符。 我尝试使用 https://github.com/mudcube/MIDI.js作为 MIDI 库,
我正在开发一个具有多个“触摸区域”的玩具,这些区域用作我的合成器的输入。 使用 oscillatorBank 我可以轻松地开始和停止音符。 在常规键盘中,每个 Midi 音符只有 1 个键,因此“重新
正在为 android 开发一个简单的键盘。我发现来自 Google 的 android-midi-lib 非常有用和强大,但在我看来它只能播放 midi 文件,但不能在键盘上按下时播放实时 midi
所以我觉得自己像个白痴,因为我必须在这里发帖来解决可能是简单的修复问题。我正在编写一个将 MIDI 发送到另一个应用程序的 iOS 应用程序。对于我的第一个概念证明,我试图在我的 iPhone 上向
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我正在制作一个 C# 程序,它应该从 MIDI 文件中读取每个音符并获取音符的长度和速度,但我不知道该怎么做... 我正在使用 DryWetMidi图书馆,但还有其他图书馆吗? 最佳答案 以 DryW
我希望使用 Swift 在 iOS 应用程序上播放单个 midi 音符。 这是我目前所拥有的,但不幸的是,这会因错误而崩溃。 func initAudio(){ let engine = AV
我儿子弹奏的弦乐器听起来非常走调。我更希望他学习一些简单的 Python 编程来演奏真正听起来像 do-re-mi 的 do-re-mi 音符。 首先,我想在 Python 上玩 do-re-mi,每
我正在使用 Arduino Yun 和 MIDI 转 USB 接口(interface),我的目标是在已安装的 Linux 操作系统上读取传入的 MIDI 音符。 目标是让 Yun 上的计算机读取音符
我是一名优秀的程序员,十分优秀!