Python板音高/频率实现

Python板音高/频率实现,python,audio,Python,Audio,我正在开发一个应用程序,为了让我的生活更轻松,它需要一个数字转换器,将音符转换成每秒做一定数量音符的频率,包括和弦 我发现它突出显示了每个音符的频率,它(与pyaudio)手动混合,使用文章中针对每个音符的映射序列制作我自己的水上烟雾表演 这是可行的,我可以通过创建并行过程来创建和弦,尽管我无法将音符或制表符编号转换为特定的音调。我的大部分数据的形式如下: 0 3 5 0 3 6 5 0 3 5 3 0 本质上,我需要一个可以返回输入频率的方程或函数,其中0是一个开放的E-low-string

我正在开发一个应用程序,为了让我的生活更轻松,它需要一个数字转换器,将音符转换成每秒做一定数量音符的频率,包括和弦

我发现它突出显示了每个音符的频率,它(与pyaudio)手动混合,使用文章中针对每个音符的映射序列制作我自己的水上烟雾表演

这是可行的,我可以通过创建并行过程来创建和弦,尽管我无法将音符或制表符编号转换为特定的音调。我的大部分数据的形式如下:

0 3 5 0 3 6 5 0 3 5 3 0
本质上,我需要一个可以返回输入频率的方程或函数,其中0是一个开放的E-low-string,每增加1个值就是一个fret-up(1=F)

难道没有明显的模式吗?

我希望如此,但我怀疑正弦波是可疑的。将E与F之差取为5.1,F与F#之差取为5.2,最后,F#与G之差取为5.5

谢谢你的帮助,非常感谢

难道没有明显的模式吗?

是的,对于一般的音乐来说有。两个相邻的音符以2^(1/12)的系数分隔。它在你的链接文章中的数字上进行了试验,并且该模式与文章中显示的有效数字完全匹配

编辑 OP要求一些代码。下面是一个快速但详细记录的镜头:

# A semitone (half-step) is the twelfth root of two
# https://en.wikipedia.org/wiki/Semitone
# https://en.wikipedia.org/wiki/Twelfth_root_of_two
SEMITONE_STEP = 2 ** (1/12)

# Standard tuning for a guitar - EADGBE
LOW_E_FREQ = 82.4    # Baseline - low 'E' is 82.4Hz
# In standard tuning, we use the fifth fret to tune the next string
# except for the next-to-highest string where we use the fourth fret.
STRING_STEPS = [5, 5, 5, 4, 5]

# Number of frets can vary but we will just presume it's 24 frets
N_FRETS = 24

# This will be a list of the frequencies of all six strings,
# a list of six lists, where each list is that string's frequencies at each fret
fret_freqs = []
# Start with the low string as our reference point
# We just short-hand the math of multipliying by SEMITONE_STEP over and over
fret_freqs.append([LOW_E_FREQ * (SEMITONE_STEP ** n) for n in range(N_FRETS)])
# Now go through the upper strings and base of each lower-string's fret, just like
# when we are tuning a guitar
for tuning_fret in STRING_STEPS:
    # Pick off the nth fret of the previous string and use it as our base frequency
    base_freq = fret_freqs[-1][tuning_fret]
    fret_freqs.append([base_freq * (SEMITONE_STEP ** n) for n in range(N_FRETS)])

for stringFreqs in fret_freqs:
    # We don't need 14 decimal places of precision, thank you very much.
    print(["{:.1f}".format(f) for f in stringFreqs])
本报告的产出:

['82.4', '87.3', '92.5', '98.0', '103.8', '110.0', '116.5', '123.5', '130.8', '138.6', '146.8', '155.6', '164.8', '174.6', '185.0', '196.0', '207.6', '220.0', '233.1', '246.9', '261.6', '277.2', '293.6', '311.1'] 
['110.0', '116.5', '123.5', '130.8', '138.6', '146.8', '155.6', '164.8', '174.6', '185.0', '196.0', '207.6', '220.0', '233.1', '246.9', '261.6', '277.2', '293.6', '311.1', '329.6', '349.2', '370.0', '392.0', '415.3'] 
['146.8', '155.6', '164.8', '174.6', '185.0', '196.0', '207.6', '220.0', '233.1', '246.9', '261.6', '277.2', '293.6', '311.1', '329.6', '349.2', '370.0', '392.0', '415.3', '440.0', '466.1', '493.8', '523.2', '554.3'] 
['196.0', '207.6', '220.0', '233.1', '246.9', '261.6', '277.2', '293.6', '311.1', '329.6', '349.2', '370.0', '392.0', '415.3', '440.0', '466.1', '493.8', '523.2', '554.3', '587.3', '622.2', '659.2', '698.4', '739.9'] 
['246.9', '261.6', '277.2', '293.6', '311.1', '329.6', '349.2', '370.0', '392.0', '415.3', '440.0', '466.1', '493.8', '523.2', '554.3', '587.3', '622.2', '659.2', '698.4', '739.9', '783.9', '830.5', '879.9', '932.2'] 
['329.6', '349.2', '370.0', '392.0', '415.3', '440.0', '466.1', '493.8', '523.2', '554.3', '587.3', '622.2', '659.2', '698.4', '739.9', '783.9', '830.5', '879.9', '932.2', '987.7', '1046.4', '1108.6', '1174.6', '1244.4']

你看到了吗?使用
aubiotes
(具有Python绑定!)可以提取注释。你真是个天才!我试着用103.8*2^(1/12)得到110,因此这清楚地说明了模式,并且能够将功率(1/12)提高到我希望得到的音符,即从0->音符100频率将是10的幂(在我的头脑中)。非常感谢,斯努布先生如果你能把问题编辑成一些代码,这对帮助其他人来说将是一件了不起的事情。哈哈,实际上我是从大学一年级的某个家伙那里学来的,我是吉他手。当然,既然你这么好心地问我,我会添加一些代码。我已经完全放弃了在我的帖子中添加格式化数学的尝试,不过:-/