Войти

Показать полную графическую версию : [решено] Вычисление формулы с записью в файл.


semiono
24-04-2013, 15:19
Очень нужен скрипт решающий такую задачу.
a * 17^(n/43), где a = 440,00 и n = {0,1,2,3,4,5,6,7,8...15,16,17}
И чтоб диапазон значений которые надо получить, можно было бы где-то от 50 до 10000 примерно распечатать.
Вывод в файл нужен примерно такой

значение
значение
значение
значение
значение
значение
...

точность - две цыфры после запятой.

Если есть варианты на Phyton и Perl тоже пишите, хотябы в личку, любые варианты интересуют

AZJIO
24-04-2013, 17:08
$a = 440
$sOut = ''
For $n = 0 To 17
$sOut &= Round($a * 17 ^ ($n / 43), 2) & @LF
Next
MsgBox(0, 'Сообщение', $sOut)

semiono
26-04-2013, 16:22
Нельзя ли поправить программу, чтобы получилось следущее

;...
$file = FileOpen("test.txt", 10)
FileWrite($file,$sOut)
FileClose($file)

файл test.txt:

...
361.08
385.68
411.94
440.00 << базовая частота $a = 440
469.97
501.98
536.16
...

То есть вниз деление, а вверх умножение от выбранной базовой точки..

Хотя, наверное можно высчитать сразу некоторое нижнее значение и от него умножением подняться наверх?
Или есть лучше способ?

Iska
26-04-2013, 16:57
semiono, лучше от базовой, в пределах октавы, в обе стороны. Дальше «танцевать» опять от «A», вверх и вниз, заданной умножением/делением базовой.

semiono
26-04-2013, 17:48
Готово! :)
$a = 440 / 17
$sOut = ''
For $n = 0 To 17 * 5 + 1
$sOut &= '(' & $n+1 & ') ' & Round($a * 17 ^ ($n / 43), 2) & @LF
Next
$file = FileOpen('17@43.hz',10)
FileWrite($file,$sOut)
FileClose($file)

AZJIO
27-04-2013, 02:21
А что это ноты что-ли? Почему они с моим вариантам и частотами не сходится? У меня и играют (http://azjio.ucoz.ru/publ/skripty_autoit3/funkcii/beep/11-1-0-21) правильно.
$a = 440
$sOut = ''
For $n = 0 To 17
$sOut &= _Func($n) & @LF
Next
MsgBox(0, 'Сообщение', $sOut)

Func _Func($iNote, $Octave = 3)
Return Round(440 * 2 ^ ($iNote / 12 + $Octave + 1 / 6 - 4))
EndFunc

semiono
27-04-2013, 13:54
Ничего себе, Тико-тико на скрипте! :)

У меня это звуковой ряд только, но он "неправильный", идея в том чтобы построить ряд который не основывается на октаве.
Кстати, у меня проблемма в том, что инструменты обычно настраиваются в центах, а не частотах.
То-есть мне нужно будет перевести этот ряд в формат microtuning в центах.
Тут бы калькулятор помог.
Скачал программу Scala 2 http://www.huygens-fokker.org/scala/ но там столько лишнего, ничего не понятно и неудобно.
Но похоже что только в ней можно частоты в центы перевести..

В синтезаторах типа Rob Papen Albino есть множество microtune пресетов, но фишка в том что они все octave-based, а мне хочется новый лад зделать)

Либо в логарифмах сразу посчитать, как записано в TUN файле, но я не соображаю чё-то в логарифмах, теряюсь..

Iska
27-04-2013, 17:22
на скрипте! »
На TurboBasic: 86013 ;).

AZJIO
27-04-2013, 18:35
semiono, а воспроизведение на чём будет? MIDI разве поддерживает такие ноты? Там только питч-бэнд использовать.
Вот ссылка (http://www.autoitscript.com/forum/topic/115869-beep/) там есть DSBeep.au3, который звук (синусоиду) в колонки пускает по частоте.

semiono
28-04-2013, 14:51
а воспроизведение на чём будет? MIDI разве поддерживает такие ноты? »
Rob Papen Albino, Blue, Linplug SaxLab, Alpha итп. все они поддерживают микротюнинг в формате tun -файлов.
Ещё u-he Zebra, ACE и Cakewalk Z3ta+ поддерживают микротюнинг.

Проблема лишь рассчитать звукоряд в центах, что по идее является логарифмической последовательностью.

AZJIO
28-04-2013, 18:59
semiono
1. Немного математики: когда то я заметил что 12 лад делит струну гитары попалам, поэтому в ней играют флажолеты, при чём каждый остоящий на 12 ладов делит струну попалам. Отсюда стало понятно что отступ каждого последующего лада является константой в относительных размерах, ну к примеру в отношении к общей длине сруны. Так как у между полным делением на 2 происходит 12 шагов деления, которые при переменожении получат коэфициент 2 то каждый шаг деления равен квадратному корню 12-ой степерни из 2. Этот коэффициент отделяет один лад от другого. Представим что в этот участок нужно сделать 7 ладов отстоящих на в процентном отношении на стандартную величину, значит требуется кофициент корень 7-ой степерни из 2. Вроде логарифмы никакие не нужны.
2. Конечно можно придумать любую другую формулу, которая вообще не будет учитывать относительность предыдущего лада к последующему. Хотя в такой системе не удастся транспонировать, не будет октав, будет одна большая октава.
3. Вообще звуки не просто вычисляются согласно неизвестному логарифму. Думаю этот звукоряд при сложении получает сложные тембры... Надо думать скорее что они будут образовывать вместе, а не каждый в отдельности.
4. Кстати, сейчас этой информацией никого не удивить, потому что в google всё это расжёвано такими специалистами, что самому ещё долго учится чтобы понять. Я на официальном сайте позже нашёл ещё несколько постов с аналогами функции _Beep, так что я оказался далеко не первым, как я думал.

semiono
28-04-2013, 20:49
Я тоже узнал однажды как делится гриф гитары, мне сразу же стало интересно творчески подумать об этом, но сейчас времена компьютеров и гитару ломать я уже не стал) тем более програмно уже даже сделали многое. Если интересно можете посмотреть микротюнинг в Albino или Alpha free.
Но дело в том что эти файлы записаны не в частотных значениях, а в степенях двойки, что вроде бы в математике называется логарифм, могу ошибаться.
Это очень удобно для октавного строя.

Но я затрудняюсь в расчëтах нестандартного строя, например, с основанием 3 а не 2,4,8..
Понимаю что это звучит необычно, но это моя фишка :)

Я сделал семплы в Sound Forge, там можно точно по частотам сгенерировать, но простой синус звучит неинтересно, причëм генерировать каждый тон звукоряда в три-четыре октавы довольно рутинная работа)

Я потом напишу расчëты как я думаю подобраться к логарифмам, но надо собраться мыслями)

AZJIO
29-04-2013, 00:54
semiono, я думаю смысл центов тот же. Разница 1 лада (интервала между двумя соседнимим нотами) 100 единиц. Если делить пополам получится средина по частоте, но не средина в музыкальном смысле, потому что 6 лад между 0 и 12-ым не является срединой. Если у нас интервал между ладами имеет коэфициент 2^(1/12), то интервал между центами = (интервал между ладами)^(1/100) или 2^(1/1200). Кстати, проверил в википедии как раз то что я и предполагал. Если вы меняете ряд на 7 нот, то цент будет 2^(1/700). Но вы всё равно получаете ноту в частотах. Центы являются отклонением от нот звукоряда, поэтому я не понимаю как вы хотите получить частоту в центах.

semiono
29-04-2013, 19:49
Центы являются отклонением от нот звукоряда, поэтому я не понимаю как вы хотите получить частоту в центах. »
Не частоту, а её отражение в центах. Впринципе это нужно не мне, а синтезатору, мне было бы проще в частотах.

Хочу уточнить и проверить, если не так поправте...

Если до "первой" октавы C1 сам тон, то его удвоение C2, а двойное удвоение C3 или же 1, 2 ,4... 64 итд.
Тогда "число" ТРИ будет лежать между 2 и 4, то есть это будет фа-диез второй октавы F#2 (?)
Числа 5, 6, 7 должны соответствовать Eb3, F#3, A3.
Иными словами они должны лежать на равных интервалах, так как темперированный строй сам по себе ровный (?)

Сложнее будет с нахождением более высоких чисел 11, 13, 17 итд. - они не соответствуют нотам..
Однако я думаю надо взять центы и вычислить просто середину между звуками темперированного строя
и найти центовое расположение ЭТИХ ЗВУКОВ.

Меня сначало смущало само деление, так как я думал оно не соответствует частоте, однако я понял,
что в самой центовой системе отражается точное следование частотам.

То есть, если мы частоты вычисляем корнями, то в центовом отображении это соответствует делению.
То есть, тут для меня лишь вопрос нахождения "середины", надеюсь я правильно понял,
что логарифмическое деление пополам равно нахождению корня из двух.

Я не математик, поэтому возможно туплю, но то что я выше обяснил, надеюсь это правильно?

* То что я называю числами, это делители частоты либо струны, но здесь это не важно, главное рассчитать правильно)

Далее просто хочу взять первый тон и верхний тон (какое нибудь простое число), например, одинадцать и поделить равномерно на звукоряд.


Я прикрепил микротюн-файл темперированного строя, чтоб видно о чём речь. Там две секции, одна лишняя и заголовки в файле не нужны,
синт Albino воспринимает только записи нот, причём можно всего одну указать. Просто файлы универсальные поэтому там лишнее присутствует.
Инфы по этому нет, но я сам покопался) Числа после запятой синт тоже игнорирует скорее всего, вобщем-то их и не слышит никто)

semiono
30-04-2013, 14:20
Первая колонка звук C в центах, вторая делитель. Начнём с величины 1200 центов.

0
1200 1 сам тон
2400 2 удвоение
3600 4 два удвоения
4800 8 ...
6000 16 ....
7200 32 ....
8400 64 здесь мы найдём середину октавы 64+32=96 или 9000 центов
9600 128

128-96=32 шага, чтобы получить значение в центах делим (9600-9000)/32 = 18,75

Значит делитель 97 равен 9000+18,75 ~9019 центам!

Пожалуйста, поправте если не так?




© OSzone.net 2001-2012