събота, 2 октомври 2021 г.

Акустика на помещение, резонанси

Звукът, който се получава в помещение, зависи не само от характеристиките на апаратурата, но и от акустиката на самото помещение.

За правилно възпроизвеждане на тембъра е необходимо цялата система, включително акустичните системи (тонколоните) да имат равна честотна характеристика - всички честоти да се просвирват с еднаква сила.

Когато такъв звук с правилно съотношение на честотите се възпроизвежда, на някои честоти звукът ще се усили и ще се получи неравномерност на честотната характеристика, поради акустичните свойства на самото помещение.

Собствени честоти


В зависимост от своята форма и размери всяко помещение има определен набор резонансни честоти (Room modes), на които звукът се усилва. За правоъгълно помещение с твърди стени тези честоти се намират по формулата за собствените честоти:

 

където f е честотата в Hz, C е скоростта на звука в m/s; nx, ny, nz са произволни три цели числа, lx,ly,lz са размерите на помещението в m.

Честотни области


Собствените резонансни честоти на помещението влияят най-много в нискочестотната област. Най-ниската резонасна честота на помещението се определя по формулата:

fl = C/(2L)

където fl е най-ниската резонасна честота в Hz, C е скоростта на звука в m/s, L е най-дългата страна на помещението в m.

Звукът с по-ниска от тази честота fl се проявява като промени на налягането. Звуците с по-високи честоти (докато дължината на вълната е сравнима с размерите на помещението), се променят поради появата на резонанси на собствените честоти.

Изчисляване на собствените честоти


Написах програма на Python, която изчислява собствените честоти (Room modes) по дадени размери на помещението:

import math

W = 3.45     # широчина на стаята, [m]
D = 4.95     # дълбочина на стаята, [m]
H = 2.61     # височина на стаята, [m]
fLow = 250.0 # условна граница на ниските честоти, [Hz]
C = 344.0    # скорост на звука, [m/s]
nxmax = 300
nymax = 300
nzmax = 300

Lr = max(W, D, H)
fpz = C / (2.0 * Lr)

fla = []
for nx in range(nxmax):
    for ny in range(nymax):
        for nz in range(nzmax):
            f = C*math.sqrt(\
              (float(nx)/W)*(float(nx)/W)+\
              (float(ny)/D)*(float(ny)/D)+\
              (float(nz)/H)*(float(nz)/H))/2.0
            fla.append(f)

fla = sorted(fla[1:])

fl = []
for f in fla:
    if f < fLow:
        fl.append(f)

print('Широчина на стаята:', W, 'm')
print('Дълбочина на стаята:', D, 'm')
print('Височина на стаята:', H, 'm')
print('Честотен диапазон на налягането:','<',round(fpz,1),'Hz')
print('Резонансни честоти в диапазона от 0.0 до',fLow,'Hz:\n',\
  ', '.join([str(round(f,1)) for f in fl]), 'Hz')


За една конкретна стая се получиха следните резултати:

Широчина на стаята: 3.45 m
Дълбочина на стаята: 4.95 m
Височина на стаята: 2.61 m
Честотен диапазон на налягането: < 34.7 Hz
Резонансни честоти в диапазона от 0.0 до 250.0 Hz:
 34.7, 49.9, 60.8, 65.9, 69.5, 74.5, 82.6, 85.5, 89.6, 95.8,
 99.7, 104.2, 105.6, 108.0, 115.6, 119.5, 121.5, 123.3, 124.5,
 131.8, 133.0, 136.3, 138.3, 139.0, 140.9, 144.3, 145.1, 147.7,
 149.0, 149.6, 153.5, 153.8, 157.1, 158.6, 161.7, 163.4, 164.9,
 165.3, 167.1, 168.0, 168.9, 171.1, 173.7, 175.3, 177.6, 179.3,
 180.7, 182.3, 183.3, 185.8, 191.5, 192.4, 193.9, 195.4, 197.7,
 197.9, 199.4, 199.4, 200.3, 200.7, 202.4, 202.4, 203.9, 204.2,
 206.8, 208.5, 209.6, 210.0, 210.9, 211.1, 211.2, 212.9, 214.4,
 214.5, 215.4, 215.9, 218.1, 218.7, 221.2, 221.4, 223.5, 223.7,
 224.1, 224.3, 225.0, 225.0, 229.0, 229.2, 231.1, 232.1, 234.5,
 238.5, 239.0, 239.8, 240.3, 241.6, 241.7, 243.0, 243.1, 243.2,
 244.7, 246.7, 246.8, 247.9, 248.3, 248.9, 249.3 Hz

Програмата дава резонансните честоти (закръглени до един знак след десетичната точка) в диапазона до една условна горна граница на нискочестотния диапазон от 250 Hz.

При повишаване на честотата броят на резонансите във всеки интервал нараства и те се разполагат така близо по честота, че започват да се сливат:

Поради това сливане на резонансите във високочестотната област честотната характеристика се изглажда и там вече няма да има толкова резки върхове и спадове.

четвъртък, 9 септември 2021 г.

Шумови характеристики на аудиоинтерфейс

Измерих някои основни шумови характеристики на USB аудиоинтерфейс Steinberg UR22C.

Без да включвам нищо на входовете (без кабели) записах четири файла със сигнал: gain0.wav, gain50.wav, gain80.wav, gain100.wav при различни нива на усилването на входа. Записвах при точност 24-bit/96000 Hz.
Така се получиха файлове, съдържащи само собствения шум на аудиоинтерфейса.

За всеки файл измерих средноквадратичното ниво на целия сигнал за левия и десния стереоканали:

Файл GAIN, [%] Продължителност, [s] L RMS, [dBFS] R RMS, [dBFS]
gain0.wav 0 58.0 -103.6 -103.6
gain50.wav 50 57.0 -99.8 -99.4
gain80.wav 80 57.0 -88.6 -89.2
gain100.wav 100 58.0 -69.5 -69.7

Мерната единица на нивото е dBFS, където 0 съответства на максималната числова стойност на цифровия сигнал, когато всички битове са единици.

След това в програмата Audacity разгледах спектрите на шумовите сигнали от файловете. За целта първо увеличих нивото на всеки сигнал със +40 dB.
Избрах ширина на прозореца на преобразуванието на Фурие 8192 точки, защото тогава при честотата на дискретизация 96000 Hz се получава приемлива минимална честота на анализа 96000/8192 = 11.71875 Hz. За изглаждане на спектъра използвах прозоречната функция "Hanning window".

Ето как изглеждат спектрите на файловете със шум:

Собственият шум при GAIN 0%
 
При ниски нива на усилването и ниски честоти до около 200 Hz шумът е близък до розов шум. Това се вижда най-ясно на участъка от 40 до 80 Hz, където графиката спада от -79 dB до около -82 dB. Теоретически спектърът на розовия шум (Pink Noise) трябва да има графика, спадаща с 3.01 dB на октава.
 

Собственият шум при GAIN 50%
 
 
Собственият шум при GAIN 80%

При високи нива на усилването в състава на шума, особено при високи честоти над 200 Hz, започва да преоблaдава бял шум с равномерен спектър.

Собственият шум при GAIN 100%


Вижда се, че в собственият шум на входа на този аудиоинтерфейс има две компоненти: при малко усилване на входа и ниски честоти - розов шум, а при увеличaване на усилването и високи честоти - бял шум. Има и неголям пик при 50 Hz - мрежов брум. Над около 16000 Hz силата на шума спада рязко.

Розовият шум, наричан още 1/f шум, има голямо значение за акустиката и електронната музика. Това е най-музикалният шум, естествено генериран от различни природни системи. На слух звукът на розовия шум прилича на шума от бушуването на някакъв водопад.


понеделник, 6 септември 2021 г.

За генеративната музика

Музиката представлява организирана система от звуци, която предизвиква определени реакции.

Обикновено музикалните звуци са тонове с определена височина и трайност, но се правят не малко експерименти с използване на произволни звуци и шумове, от които се изграждат музикални композиции (или поне звукови композиции).

Така музикалното произведение се строи от определен звуков материал - тонове или шумове. Композиторът организира този материал в осмислена система от звуци, които прозвучават последователно или едновременно.

Повторението е най-простия начин да се получи организирана система.
В следващия пример с програма съм получил случайна последователност от 5 тона, която се повтаря 8 пъти:

Пограмата, с която генерирах този пример, е написана на езика на системата LilyPond:

\version "2.18.2"
nnotes = 5   % брой ноти в мотива
duration = 2
% 0-цели, 1-половини, 2- четвъртини, 3-осмини, 4 - шестнадесетини, 5-тридесетивторини
ambitus = 24
randomNotes =
  {
    $(let ((random-state (seed->random-state (current-time))))
      (make-sequential-music
        (map (lambda (x)
               (let ((idx (random ambitus random-state)))
                 (make-event-chord
                   (list
                     (make-music 'NoteEvent
                                 'duration (ly:make-duration duration 0 1/1)
                                 'pitch (ly:make-pitch
                                   (quotient idx 7)
                                   (remainder idx 7)
                                   0))))))
              (make-list nnotes))))
  }
motiv = \randomNotes
\score {
  \new StaffGroup <<
    \new Staff {
      \set Staff.midiInstrument = #"acoustic grand"
      \tempo 4 = 240
      \time 5/4
      \motiv
      \motiv
      \motiv   
      \motiv
      \motiv
      \motiv   
      \motiv
      \motiv   
      \bar "|."
    }
  >>
  \layout {
    \context {
      \Score
      \remove "Timing_translator"
      \remove "Default_bar_line_engraver"
    }
    \context {
      \Staff
      \consists "Timing_translator"
      \consists "Default_bar_line_engraver"
    }
  }
 \midi { }
}
 

Тази програма чертае нотния запис и създава MIDI файл, който може да бъде изсвирен от виртуален или хардуерен инструмент.

Еднотактовият мотив сам по себе си представлява просто 5 случайни ноти. Но, когато започне да се повтаря, възниква някаква музикална логика.

Философско отклонение

Не е задължително композиторът да бъде човек. Възможно е компютърна програма да създава музикални произведения по определени правила. Тези правила могат да бъдат целенасочено измислени или да бъдат в някаква степен случайни или подчиняващи се на математически или други закономерности, взети извън музиката.

Например, правен е опит очертанията на една планина със своите върхове да бъдат изтълкувани като мелодична линия, задаваща промяната на височината на тоновете във времето.

Генеративната музика (Generative music) се създава непосредствено в процеса на изпълнението от компютър или друга автоматична система (например аналогова моделираща система, модулен синтезатор или други устройства). Правилата за автоматично генериране на тоновете могат да съдържат в различни пропорции определеност или случайност.

Генеративното музикално произведение може постоянно да варира, никога да не се повтаря точно и да звучи потенциално безкрайно.

По начало се предполага, че музиката освен форма има и някакво съдържание, смисъл. Когато композиторът е човек, може да се очаква, че той предава някакъв смисъл със своето произведение. Но когато музиката се генерира автоматично какъв е нейният смисъл ?

Възможен отговор дава природата. Какъв е смисълът на някоя планина или друг красив природен пейзаж ? Тях не ги е създал нарочно някой човек с цел да бъдат красиви или да предават някакъв смисъл. Въпреки това и красотата на природата, както изкуството, може да предизвиква емоционална реакция у човека. Така изглежда, че това са родствени феномени.

Практически опити

Направих прости софтуерни системи, които пораждат автоматично мелодични последователности. В един експеримент използвах нееднородна система: в Linux стартира семпъл-плейъра timidity, в който съм заредил свои семпли; по-нататък във виртуалния модулен синтезатор VCV Rack се генерира последователност от MIDI ноти, които се подават на timidity да ги изсвири.

Като семпли записах тоновете на калимба. Използвах диатонична алт-калимба Bolf Kalimbas с 15 пластини в сол мажор. Тази калимба има тяло във вид на плътна дъска от орех. Пластините са от пружинна стомана и са доста ниско над тялото, но при тихо и внимателно свирене звукът е изключителен.

Общият брой на пластините и строя са от значение за звука, защото когато се удря една пластина зазвучава не само тя, но едновременно и някои от другите, които са в резонанс със нейните обертонове. Така се формира много богата обща звучност.

Получи се такава последователност от тонове:



Част от нея в нотен запис изглежда така (с темпо 60 четвъртини в минута):

Системата от модули на VCV Rack, с която е генериран този пример, изпълнява само функциите да създава последователността от MIDI ноти. Най-общо, чрез модул генератор на шум и модул Sample&hold се генерират случайно променящи се височини на ноти; с нискочестотни осцилатори LFO и генератори на шум се модулира силата на тоновете. Накрая получената последователност от MIDI ноти се подава на работещия като сървър семпъл-плейър timidity.

Софтуерният модулен синтезатор VCV Rack е удобен и за живо изпълнение. Чрез модула MIDI-MAP с хардуерен MIDI контролер или клавиатура може да се управляват различни параметри на другите модули. А модулът CV-MIDI може да управлява освен виртуални инструменти и външни хардуерни синтезатори.