LINUX.ORG.RU

Ноты

 


3

2

Здравствуйте. Тут собрались крутые кодеры, которые мне помогут и ответят.

Есть нота. Частота 440 Гц. Как сделать .wav, который состоит только из этой ноты?

Я знаю ноты мелодии. Как сделать .wav, который состоит из этих нот?

Есть .wav с мелодией. Из каких нот он состоит?

Открыть в Audacity и сгенерировать там. А если тебе именно путём погроммирования надо, то ищешь описание формата WAV, затем пишешь прогу, в ней цикл нужной длительности, и в цикле пишешь в файл сэмплы синусоиды с нужной частотой

Harald ★★★★★ ()

Есть нота. Частота 440 Гц. Как сделать .wav, который состоит только из этой ноты?

Взять синус, дискретизировать с нужной точностью и частотой, добавить к этому WAV заголовок, сохранить в файл.

Я знаю ноты мелодии. Как сделать .wav, который состоит из этих нот?

Повторить вышеописанное для каждой ноты. Если нужно многоголосое звучание, почитать ещё про смешивание аудиосигналов.

Есть .wav с мелодией. Из каких нот он состоит?

Почитать что такое дискретное преобразование Фурье, взять fftw, прогнать через него данные, по спектру определить основную частоту, по ней ноту. Если нужно распознавание многоголосовых данных и/или реальных инструментов у которых спектр сильно отличается от синуса, читать дальше теорию по этому вопросу.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от Harald

Есть .wav с мелодией. Из каких нот он состоит?

Это можно определить с помощью преобразования Фурье

Да, но это гораздо сложнее, чем может показаться на первый взгляд. Самая запара в том, что основной тон ноты по амплитуде может быть ниже, чем обертона. В исходниках Lingot можно глянуть.

Но если чистый синус, то да,

import numpy as np

w = wave.open('440.wav', 'wb')
w.setparams((1, 1, 44100, 0, 'NONE', 'NONE'))
w.writeframes(note(440, 5))  # см. note() в примере ниже
w.close()

w = wave.open('440.wav')
n = w.readframes(-1)

freq = 44100 * (np.argmax(abs(np.fft.fft(list(n)))[1:]) + 1) / len(n)

print(freq, 'Hz')
$ python w.py
440.0 Hz

Что касается генерации, то вообще изи:

import wave
from math import sin, pi

def note(f, t, sf=44100):
    n = (sin(2*pi*f*i/sf) for i in range(round(t*sf)))
    return bytes(round(127+127*i) for i in n)

w = wave.open('wave.wav', 'wb')
w.setparams((1, 1, 44100, 0, 'NONE', 'NONE'))

Cmajor = [(261.6256, 0.25), (329.6276, 0.25), (391.9954, 0.33)]
for f,t in Cmajor:
    n = note(f, t)
    w.writeframes(n)

w.close()
anonymous ()
Ответ на: комментарий от Cameyoc

Я человек простой. Мне исходник нужен. Либо руководство для программ.

Я студент простой. Мне готовая лаба нужна. Либо пошаговая инструкция для безграмотных, дабы мозг не включать.
fixed

erfea ★★★★★ ()

удеви препода

import wave; from numpy import linspace, sin, pi, exp, log
note = lambda f,t: sin(linspace(0, 2*pi*f*t, round(t*44100)))
chrd = lambda f,t,m=0: (note(f,t) + note(2**((4-m)/12)*f,t) + note(2**(7/12)*f,t)) / 3
w = wave.open('wave.wav', 'wb'); w.setparams((1, 2, 44100, 0, 'NONE', ''))
for f,m in [(2**(3/12),0), (1,1), (2**(-4/12),0), (2**(-2/12),0)] * 8:
  c = chrd(220*f, 1.76, m) * exp(-log(linspace(0.01,7,round(1.76*44100)))**2)
  w.writeframes((c*0x7fff).astype('i2'))
w.close()

послушать результат

anonymous ()

Сгенерировать ноту:

sox -n -r 8000 output.wav synth 3 sine 500

где:

  • -n - нет входного файла
  • -r 8000 - частота дискретизации в итоговом файле
  • output.wav - имя выходного файла
  • synth 3 - синтезировать 3 секунды
  • sine 500 - синус с частотой 500 Гц.
Xintrea ★★★★★ ()
Ответ на: комментарий от Cameyoc

Я человек простой. Мне исходник нужен.

Так аудасити открытый, бери и смотри.

А вообще тебе выше правильно сказали - тебе нужен MIDI.

Ты хочешь на пистоне ноты генерить? Путь примерно такой: ищешь/пишешь либу, генеряющую тебе midi файл из нужных нот, запускаешь «экспорт» в wav из midi, используя либо очередную либу, либо любой внешний конвертер (не удивлюсь, если ffmpeg умеет).

Насчет распознавания будет сложнее, думаю, но путь примерно такой же.

Zhbert ★★★★★ ()

Аудио файлы не состоят из нот. Почитай про частоту дискретизации и разрядность (битность). Много раз в секунду фиксируется звуковое давление (громкость), всё это записывается в файл с применением различных кодировок (сжатия). Wav это формат без сжатия. Можно сгенерировать звук программно, это называется синтезом и делается в секвенсерах (sequencer), где создаются партии midi (хоть мышкой вози, хоть специальную клавиатуру подключай). Затем на дорожку накладываются эффекты по вкусу, чтобы звучало более интересно. В Linux самый удобный редактор для создания музыки - LMMS. А как синтезировать звук на низком уровне тебе уже написали, готовые решения за бесплатно никто писать не станет. Если учишься на кодера и у тебя такие мысли, следует задуматься о смене профессии, потому что на работу всё равно не попадёшь.

InterVi ★★★ ()
Последнее исправление: InterVi (всего исправлений: 2)

Я когда в аудиоредакторе открываю .wav, то вижу какую-то штуку, похожую на закрашенное приближение криволинейной трапеции. Когда нажимаю на проигрывание, по нему бежит линия. Это что за зверь? По нему можно глазуально определить частоты?

Cameyoc ()
Ответ на: комментарий от Cameyoc

Спасибо

Пож. Удивительно, да, как из кучки непонятных циферок появляется такая красота. Я вот сейчас слушаю и сам удивляюсь :)

в аудиоредакторе открываю .wav … можно глазуально определить частоты?

Если это Audacity, то там есть режим отображения спектра вместо волны. Нажми Shift+M и выбери Spectrogram («Спектрограмма», наверное, по-русски будет). https://www.youtube.com/watch?v=7WYw3qoTdU4

Если какой-то другой, то по-любому есть анализатор спектра, поищи.

anonymous ()