Вверх ↑
Этот топик читают: Гость
Ответов: 75
Рейтинг: 4
#1: 2022-10-27 19:06:09 ЛС | профиль | цитата
Существует этакий жанр музыки, чем-то похожий на Chiptune, под названием "Bytebeat".
Заключается он в создании музыки (хотя не обязательно музыки, можно и звук который колонки поломает ) с помощью математических выражений.
Почитать про это можно здесь: http://canonical.org/~kragen/bytebeat/ (там кстати есть видео)
Вообщем, недавно я задался вопросом "можно ли сделать это в HiAsm?" и ответ ясное дело что да, однако как оказалось это просто так не выйдет.
Я решил сделать это используя используя проект консольной программы, а также компоненты For, MathParse и Converter (в режиме IntToChar). Решил использовать следующее выражение: t&t››8
Решил проверить свою программу именно на этом выражении, и поместить его в MathParse (где вся магия и будет происходить). Однако с t итак ясны дела: MathParse фиг знает что это такое. Поэтому заменил t на %1.
Сама программа просто запускает счётчик от 0 до 240000 (решил использовать частоту дискретизации 8000, и сгенерировать 30 секунд аудио), потом использует его как %1 в выражении, и переводит результат в символ, который потом выводится в консоль.
Компилирую, открываю командную строку и перенаправляю данные в файл. Открываю Audacity чтобы посмотреть, если получилось. И увидел я там очень медленную пилообразную волну, что совсем мне не нужно.
Позже оказалось что MathParse обрабатывает операторы ›› и ‹‹ на том же уровне что и &, | и !. Поменял выражение: t&(t››8) и теперь всё нормально работает.
Кстати, вот сама программа:
Add(Console,2953706,21,105)
{
link(onStart,14894531:doFor,[])
}
Add(Convertor,16410013,294,105)
{
Mode=4
link(onResult,2953706:doWrite,[(366,111)(366,99)(9,99)(9,111)])
}
Add(For,14894531,112,105)
{
End=240000
link(onEvent,3816027:doCalc,[])
}
Add(MathParse,3816027,203,105)
{
DataCount=1
MathStr="%1&(%1››8)"
ResultType=0
link(onResult,16410013:doConvert,[])
}
В интернете есть целая куча разных Bytebeat выражений, однако те что Си-совместимы (означает что выражение будет исправно работать в программе написанная на Си) лучше всего работают. Однако оператор % в таких нужно заменить на mod, иначе даже они работать не будут. Выражения с тернарными операторами (? и :) по-любому работать не будут. (если только не придумать другое выражение, которое будет выводить похожий результат и не использовать эти самые операторы)

Редактировалось 3 раз(а), последний 2022-10-27 19:12:36
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 8799
Рейтинг: 817
#2: 2022-10-27 20:04:02 ЛС | профиль | цитата
Слов нет
Gunta, вы можете перевести на Паскаль шедевры:


t*5&(t>>7)|t*3&(t*4>>10)

(t*5&t>>7)|(t*3&t>>10)

t*9&t>>4|t*5&t>>7|t*3&t/1024

((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7

на C:
main(t){for(;;t++)putchar(((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1 ^7&(т>>19)))|т>>7);}
карма: 18

0
Ответов: 5179
Рейтинг: 577
#3: 2022-10-27 20:22:59 ЛС | профиль | цитата
Леонид, Паганини поди в гробу переворачивается от таких творцов
карма: 4
0
Ответов: 8799
Рейтинг: 817
#4: 2022-10-27 22:33:20 ЛС | профиль | цитата
andrestudio, да там заточено под целочисленную арифметику, сложение и умножение на 2^n (сдвиг), из форм звука пила, да меандр, даже треугольника нет, хотя он более похож на синус гармоники слух режут страсть как. Надо бы коллегу flint2 спросить, сценарии и авто-диалоги поди сложнее на порядки, но ведь получаются
карма: 18

0
Ответов: 471
Рейтинг: 160
#5: 2022-10-27 22:56:40 ЛС | профиль | цитата
TheRenat писал(а):
MathParse обрабатывает операторы ›› и ‹‹
Странно , у меня не работает...
Консоль.jpg
карма: 4

0
Ответов: 75
Рейтинг: 4
#6: 2022-10-27 23:45:05 ЛС | профиль | цитата
tig-rrr писал(а):
Странно , у меня не работает...

Шутки форума; преобразовались "стрелочки" в кавычки. Поменяй:
›› на >>

Редактировалось 2 раз(а), последний 2022-10-27 23:45:42
карма: 0

0
Ответов: 5179
Рейтинг: 577
#7: 2022-10-27 23:52:44 ЛС | профиль | цитата
Леонид, только не подумайте что я циник какой то. Мне нравится современная инструментальная музыка. (даже сейчас не могу вспомнить сколько своих работ вдохновлённый их музыкой) я сделал только с помощь этих авторов как Modern Martina & KorgStyle. Вот для чего нужны профессиональные синтезаторы. А все остальные погремушки уйдут в лепту так или иначе.
карма: 4
0
Ответов: 8799
Рейтинг: 817
#8: 2022-10-28 00:07:39 ЛС | профиль | цитата
andrestudio, https://youtu.be/0-44Fhr91U8
карма: 18

0
Ответов: 5179
Рейтинг: 577
#9: 2022-10-28 16:49:23 ЛС | профиль | цитата
Леонид, обычно такие шедевры на семи-струнке играют, но он вытянул на 6(ти). Молодец мужик конечно!
карма: 4
0
Ответов: 457
Рейтинг: 84
#10: 2022-11-08 10:04:44 ЛС | профиль | цитата
Леонид писал(а):
Gunta, вы можете перевести на Паскаль шедевры:

Это обычная функция y=f(x) где
Х - (t) – это время 1/8000 секунды (8000 Гц)
Y – может принимать значение от 0 до 255 (8 бит). Поэтому при Y=t прямая превращается в пилу. При Y=-t пила направлена в обратную сторону.
Всё остальное:
Математические операторы: ( ) + - * / %
Побитовые операторы: & | ^ << >>
Условные операторы: < > <= >= == !=
Из непонятного (или нет прямых аналогов в Hiasm)
% - это (x mod y) остаток от деления
AND(&) – это битовое И
OR(|) – это битовое ИЛИ
XOR (^) - это исключающее ИЛИ
<< - это битовый сдвиг влево
>> - это битовый сдвиг вправо

Слушать это невозможно, но посмотреть на график – пожалуйста.
Add(MainForm,493884,294,196)
{
Width=1100
link(onCreate,490923:doEvent1,[])
}
Add(MathParse,11847206,553,308)
{
DataCount=1
MathStr="%1"
ResultType=0
Point(doMathStr)
link(onResult,13828687:doConvert,[])
}
Add(Plotter,12712431,826,308)
{
Width=1084
Height=261
Align=5
Name="Bytebeat"
}
Add(Replace,3578264,490,266)
{
SubStr="t"
DestStr="%1"
link(onReplace,11847206:doMathStr,[(529,272)(529,321)])
link(Str,14823762:String,[])
}
Add(PlotLines,12628120,763,308)
{
Grapher="Bytebeat"
link(ValueX,6061727:Position,[(776,299)(755,299)(755,348)(433,348)])
}
Add(For,6061727,427,308)
{
End=1000
link(onEvent,11847206:doCalc,[])
}
Add(ComboBox,14823762,483,182)
{
Left=430
Top=290
Align=2
Font=[MS Sans Serif,12,0,0,1]
Strings=#1:t|2:-t|8:t mod 4|8:t mod 2|5:t * 2|3:t*t|11:t mod 2 -t|24:(t mod 255)+(t mod 64)|0:|1:0|0:|2:0 |0:|0:|
Text="t"
Point(doSelect)
link(onClick,7368748:doEvent1,[(522,195)(522,230)(382,230)(382,265)])
}
Add(Hub,490923,350,210)
{
link(onEvent1,14823762:doSelect,[])
link(onEvent2,7368748:doEvent2,[(375,223)(375,272)])
}
Add(Hub,7368748,392,259)
{
InCount=2
OutCount=3
link(onEvent1,12628120:doClear,[(746,265)(746,321)])
link(onEvent2,3578264:doReplace,[])
link(onEvent3,6061727:doFor,[(417,279)(417,314)])
}
Add(Convertor,13828687,602,308)
{
Mode=8
link(onResult,13292992:doCopy,[])
}
Add(Convertor,3952402,700,308)
{
Mode=7
link(onResult,12628120:doAdd,[])
}
Add(Copy,13292992,651,308)
{
Count=8
Direction=1
link(onCopy,3952402:doConvert,[])
}


P.S. Исправил небольшую ошибку

Редактировалось 2 раз(а), последний 2022-11-08 12:05:18
карма: 10

0
Ответов: 8799
Рейтинг: 817
#11: 2022-11-08 10:31:55 ЛС | профиль | цитата
Gunta, спасибо!
Слушать -- ужас
карма: 18

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)