31EDO Piano — Мини-синтезатор на Pixilang

Pixilang по русски
Post Reply
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

31EDO Piano
Необычная клавиатура, на которой можно сыграть в строе «31 ступень в октаве»

Почему 31? :) Это много или мало? :unknown:
Строй 31EDO позволяет достаточно точно воспроизводить натуральные гармоники от 1 до 16 (в т.ч. 13-я — с небольшой погрешностью) и их соотношения.
Можно играть обычные мелодии, а можно обогатить их микротоновыми созвучиями.
Любой музыкант сможет распознать на слух мажорное и минорное трезвучия (соотношения частот 4:5:6 и 10:12:15, соответственно). Но не всем знакомы, к примеру, "субминорное" (6:7:9) или "нейтральное" (18:22:27) трезвучия, которые встречаются в индийской и арабской музыке. На клавиатуре 31EDO их можно сыграть, отступив от нижней ноты 10 и 18; 8 и 18; 7 и 18; 9 и 18 ступеней соответственно.
Ещё одним преимуществом строя 31EDO является то, что одна его ступень - 1/31 октавы - достаточно велика, она заметно больше коммы 81/80, что позволяет различать диатонический и хроматический полутона (3 и 2 ступени, соответственно; здесь B# и С — разные ноты) и не задумываться о различии между "большим тоном" (9/8) и "малым тоном" (10/9), т.е. этот строй является среднетоновым.

Нарисуйте любую форму звуковой волны и тут же отредактируйте её спектр — преобразование Фурье вычисляется «на лету».

Текущая версия 0.5
31edo_piano_0_5.pixi
Файл обновлён 17.08.18 (+3 исправления)
(21.1 KiB) Downloaded 558 times
В данном примере клавишам, которые соответствуют гармоникам от 1 до 16 от ноты "До", назначены цифровые и буквенные клавиши ПК.
31edo.png
31edo.png (16.02 KiB) Viewed 9275 times
Last edited by iHs on Fri Nov 16, 2018 6:42 pm, edited 5 times in total.
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

31EDO Piano
Версия 0.1

Начальная версия.
Пока не удаётся наладить работу мультитача на Android-устройствах. Страшный код работы с клавиатурой. Нет подсветки нажатых клавиш. Но оно работает!
31edo_piano_0_1.txt
(15.17 KiB) Downloaded 586 times
Harmonics.png
Harmonics.png (12.63 KiB) Viewed 9159 times
Last edited by iHs on Sun Mar 18, 2018 10:02 pm, edited 2 times in total.
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by NightRadio »

Отличная идея! :good:
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

31EDO Piano
Версия 0.3
  • Наконец-то работает мультитач
  • Добавлена визуализация звука (можно отключить в начале файла) и нажатых клавиш
  • Небольшая оптимизация
31edo_piano_0_3.txt
(15.64 KiB) Downloaded 615 times
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

Просьба к админам: пожалуйста, сделайте возможность добавления файлов с расширением .pixi. Всё-таки профильный форум :)
Да, и хочу заметить, в языке Pixilang очень не хватает оператора for. Было бы удобнее - не загромождать программу строками инициализации и инкремента, которые можно и забыть дописать. Плюс большая совместимость с языком Си. Потом останется только объявить переменные и функции, расставить ; везде где надо - и можно компилировать по-настоящему.
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by NightRadio »

пожалуйста, сделайте возможность добавления файлов с расширением .pixi. Всё-таки профильный форум
Добавил. Но я все-таки рекомендую упаковывать любые файлы программ в ZIP.

Да, и хочу заметить, в языке Pixilang очень не хватает оператора for. Было бы удобнее - не загромождать программу строками инициализации и инкремента, которые можно и забыть дописать. Плюс большая совместимость с языком Си. Потом останется только объявить переменные и функции, расставить ; везде где надо - и можно компилировать по-настоящему.
Увы, для совместимости с Си тут многого не хватает. При этом while {} как раз таки идеально совместим с Си :)
Конструкция for() {} есть в планах очень давно, но времени на реализацию до сих пор не нашлось. Может быть, в будущих версиях...
Либо кто-то сделает это за меня - исходники Pixilang открыты.
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

31EDO Piano
Версия 0.5
  • Теперь можно играть с клавиатуры ПК. Удерживая любую клавишу мышью, нажмите кнопку на клавиатуре, чтобы назначить её для данной ноты, или пробел, чтобы удалить назначенные клавиши
  • При выходе из программы тембр и назначенные клавиши сохраняются в файл "31.dat", при повторном входе данные загружаются
  • Затухание звука сделано не простым изменением амплитуды, а фильтром нижних частот, т.е. динамически меняется его тембр (если эта опция тормозит приложение, то её можно отключить; настройки, как обычно, находятся в начале кода)
  • Также можно настроить масштаб клавиатуры, высоту чёрных и серых клавиш
  • Небольшие улучшения производительности
31edo_piano_0_5.pixi
Файл обновлён 17.08.18 (+3 исправления)
(21.1 KiB) Downloaded 506 times
Last edited by iHs on Fri Aug 17, 2018 8:17 pm, edited 3 times in total.
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by NightRadio »

Программа становится все лучше!
Правда, у меня на компе отказывается нормально выходить. После нажатия ESC виснет на несколько секунд, а потом пишет, что потоки 0 и 1 не отвечали и были удалены принудительно. Сходу не понял, почему. Глянул в код - вроде бы выход корректно сделан.
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

Я хотел сделать автосохранение/загрузку настроек, но был странный баг - при выходе из программы файл не сохранялся:

Code: Select all

if EVT[ EVT_TYPE ] == EVT_QUIT
{
	set_audio_callback(-1)
	thread_destroy(display_thrd)
	if storesettings
	{
		stream = fopen("31.dat", "wb")
		if stream
		{
			fwrite(samp, 256, stream)
			fwrite(keymap, 558, stream)
			fclose(stream)
		}
	}
	halt
}
Но в другой программе всё работало!

Code: Select all

if EVT[ EVT_TYPE ] == EVT_QUIT { 
	stream = fopen("keys.txt", "wb")
	if stream
	{
		fwrite(table, 256, stream)
		fclose(stream)
	}
	halt
}
Оказалось, что этому препятствует строка thread_destroy(display_thrd). Стоило её перенести ниже, после всех операций с файлом, как файл стал создаваться без проблем. (В теме эта ошибка уже исправлена.)
Да, программа завершает работу долго (3-4 секунды на Windows и Android). На какой системе у вас была ошибка7
User avatar
NightRadio
Site Admin
Posts: 3941
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by NightRadio »

Оказалось, что этому препятствует строка thread_destroy(display_thrd).
Это происходит потому, что display_thrd не имеет выхода. Там внутри бесконечный while(), который нужно чем-то разрывать при выходе из программы. Автоматически это не делается, т.к. можно остановить thread не в том месте и потерять какие-то полезные данные.
Самый простой и логичный способ - писать что-то типа while( exit_request ) { ... }
а потом перед thread_destroy() пишем exit_request = 1

По истечении нескольких секунд потоки все-таки останавливаются принудительно, о чем Pixilang сообщает в консоли. Но, как я отметил выше, это аварийный небезопасный способ.

thread_destroy() не останавливает поток, а просто ждет, когда поток остановится, чтобы освободить его ресурсы.
И, кстати, если создать поток с флагом THREAD_FLAG_AUTO_DESTROY, то thread_destroy() вообще можно не выполнять - ресурсы освободятся сами, как только поток завершится.
User avatar
iHs
Posts: 38
Joined: Sat Jan 13, 2018 11:02 pm

Re: 31EDO Piano — Мини-синтезатор на Pixilang

Post by iHs »

NightRadio wrote: Thu Aug 16, 2018 10:34 pmthread_destroy() не останавливает поток, а просто ждет, когда поток остановится
Спасибо, исправлено.

Обнаружился баг в Notepad++: при поиске по Ctrl+F он не находит комбинацию квадратной скобки с пробелом, например "[ " или "] ".
Post Reply