Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вычисление формулы с записью в файл. (http://forum.oszone.net/showthread.php?t=259315)

semiono 24-04-2013 15:19 2138917

Вычисление формулы с записью в файл.
 
Очень нужен скрипт решающий такую задачу.
Код:

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 2138966

Код:

$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 2140048

Нельзя ли поправить программу, чтобы получилось следущее

Код:

;...
$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 2140076

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

semiono 26-04-2013 17:48 2140102

Готово! :)
Код:

$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 2140297

А что это ноты что-ли? Почему они с моим вариантам и частотами не сходится? У меня и играют правильно.
Код:

$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 2140431

Ничего себе, Тико-тико на скрипте! :)

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

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

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

Iska 27-04-2013 17:22 2140518

Цитата:

Цитата semiono
на скрипте! »

На TurboBasic: Файл 86013 ;).

AZJIO 27-04-2013 18:35 2140584

semiono, а воспроизведение на чём будет? MIDI разве поддерживает такие ноты? Там только питч-бэнд использовать.
Вот ссылка там есть DSBeep.au3, который звук (синусоиду) в колонки пускает по частоте.

semiono 28-04-2013 14:51 2141121

Цитата:

Цитата AZJIO
а воспроизведение на чём будет? MIDI разве поддерживает такие ноты? »

Rob Papen Albino, Blue, Linplug SaxLab, Alpha итп. все они поддерживают микротюнинг в формате tun -файлов.
Ещё u-he Zebra, ACE и Cakewalk Z3ta+ поддерживают микротюнинг.

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

AZJIO 28-04-2013 18:59 2141240

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

semiono 28-04-2013 20:49 2141299

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

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

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

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

AZJIO 29-04-2013 00:54 2141414

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

semiono 29-04-2013 19:49 2141851

Вложений: 1
Цитата:

Цитата AZJIO
Центы являются отклонением от нот звукоряда, поэтому я не понимаю как вы хотите получить частоту в центах. »

Не частоту, а её отражение в центах. Впринципе это нужно не мне, а синтезатору, мне было бы проще в частотах.

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

Если до "первой" октавы 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 2142284

Первая колонка звук 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 центам!

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


Время: 06:54.

Время: 06:54.
© OSzone.net 2001-