Плейер световых эффектов - помогите стать лучше
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Аёпт, надеюсь, ничего страшного. Ну, выздоравливайте скорее
.
Я всё-всё узнAю и стану профессором.
- Реклама
да че там страшного - обычный ковид...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 615
- Зарегистрирован: Вс дек 28, 2014 21:54:05
Аааа, ну это х&@ня, я уже после, завтра уже на работу 
Я всё-всё узнAю и стану профессором.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
Наконец собрался и сегодня написал VM, для такого простого набора команд просто и получилось, полторы сотни строк. Для тестов вместо бьющих по глазам диодов вывожу картинку на дисплей, квадрат 8x8 из квадратов поменьше. Также набросал парочку тестовых скриптов:
Это бегущая строка "Hello World" размером 198 байт. Следующее - типа бегущих огней, но по спирали(107 байт):
Теперь нужно с набором функций определиться, форматами цвета т.д., потому что в принципе можно одним hsv обойтись, но местами с rgb быстрее. Опять же передавать hsv в функции или хранить в глобальной переменной, передавать hsv целиком или покомпонентно чтобы с ними было удобнее работать...
Спойлер
Код: Выделить всё
var chars = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, // H
0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, // e
0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00, // l
0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // o
0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, // W
0x00, 0x00, 0xD8, 0x6C, 0x6C, 0x60, 0xF0, 0x00, // r
0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00}; // d
var helloWorld = { 1, 2, 3, 3, 4, 0, 5, 4, 6, 3, 7, 0 };
var curChar = 0;
var shift = 0;
while(1)
{
var offset = peek(helloWorld, curChar) * 8;
var offset2 = peek(helloWorld, (curChar + 1) % 12) * 8;
for(var y = 0; y < 8; y++)
{
var line = (peek(chars, y + offset) << 8) | peek(chars, y + offset2);
line <<= shift;
for(var x = 0; x < 8; x++)
{
var color = 128;
if(line & 0x8000) color = 0;
paint(y * 8 + x, color);
line <<= 1;
}
}
if(++shift > 7)
{
shift = 0;
if(++curChar > 11) curChar = 0;
}
wait(80);
}Спойлер
Код: Выделить всё
var arr = { 27, 28, 36, 35, 34, 26, 18, 19, 20, 21, 29, 37, 45, 44,
43, 42, 41, 33, 25, 17, 9, 10, 11, 12, 13, 14, 22, 30, 38, 46,
54, 53, 52, 51, 50, 49, 48, 40, 32, 24, 16, 8, 0, 1, 2, 3, 4,
5, 6, 7, 15, 23, 31, 39, 47, 55, 63, 62, 61, 60, 59, 58, 57, 56 };
var offset = 0;
while(1)
{
for(var i = 0; i < 64; i++)
{
var h = (i * 4 + offset) & 0xFF;
paint(peek(arr, i), h);
}
wait(1);
offset++;
}любопытно было бы посмотреть на эффект в реале или симуляции. поскольку ваши скрипты мною не воспринимаются, представить результат не могу...
а так же хотелось бы разобраться об аппаратной платформе, способной такое воспроизвести - я подозреваю, что это не atmega328 будет...
а так же хотелось бы разобраться об аппаратной платформе, способной такое воспроизвести - я подозреваю, что это не atmega328 будет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=4186732#p4186732"]любопытно было бы посмотреть на эффект в реале или симуляции. поскольку ваши скрипты мною не воспринимаются, представить результат не могу...[/uquote]
Да ладно, синтаксис на 98% сишный, по крайней мере последний скрипт должен легко читаться, в этом одно из преимуществ. Из отличий можно выделить var, который по сути int32, но для AVR можно уменьшить, даже проще станет. А для массивов var - это int8[], а сами массивы только для чтения, первые два байта хранят размер и максимальное смещение от начала программы тоже 16-ти битное, доступ при помощи [] скорее всего позже добавлю. Еще "&&" и "||" не "short circuit", т.е. всегда вычисляются обе части выражения, но предварительно они приводятся к bool. Дальше, переменных может быть 32 штуки, функций тоже, но это все легко расширить при необходимости. Команды переходов могут прыгать в пределах 8КБ. Во втором скрипте в массиве хранятся индексы диодов описывающие спираль, потом в цикле для каждого диода задается hsv, в данный момент только h, а sv на максимуме, потому что пока не определился, затем этот h масштабируется чтобы перекрыть весь диапазон. Если взять такую полоску, разбить ее на 64 сегмента, свернуть в квадратную спираль и скролить, то получится именно то, что делает этот скрипт.

Дизассм для него будет следующий:
Семь байт в конце - это массив. Выражение внутри paint() состояло из одних констант и свернулось в константу. Большинство команд однобайтовые и парсятся элементарно, могу даже показать как это выглядит:
При этом часть инструкций опциональны(Addi/Subi), а самая большая Pushk таковая из-за того, что числа могут быть 8/16/24/32 бита, если на AVR будет только 8/16, то можно значительно ее упростить. И мне кажется работать будет быстрее чем с твоими текстовыми скриптами, особенно команды типа PM которые в цикле будут парситься на каждом проходе и занимающие в 2 раза больше памяти, у меня просто на стек кидается смещение массива от начала программы, потом paintMap() берет его стека, прибавляет к указателю на начало скрипта и получается адрес по которому хранится размер массива и потом сырые байты.
ps. Кому интересно может поиграться.
Да ладно, синтаксис на 98% сишный, по крайней мере последний скрипт должен легко читаться, в этом одно из преимуществ. Из отличий можно выделить var, который по сути int32, но для AVR можно уменьшить, даже проще станет. А для массивов var - это int8[], а сами массивы только для чтения, первые два байта хранят размер и максимальное смещение от начала программы тоже 16-ти битное, доступ при помощи [] скорее всего позже добавлю. Еще "&&" и "||" не "short circuit", т.е. всегда вычисляются обе части выражения, но предварительно они приводятся к bool. Дальше, переменных может быть 32 штуки, функций тоже, но это все легко расширить при необходимости. Команды переходов могут прыгать в пределах 8КБ. Во втором скрипте в массиве хранятся индексы диодов описывающие спираль, потом в цикле для каждого диода задается hsv, в данный момент только h, а sv на максимуме, потому что пока не определился, затем этот h масштабируется чтобы перекрыть весь диапазон. Если взять такую полоску, разбить ее на 64 сегмента, свернуть в квадратную спираль и скролить, то получится именно то, что делает этот скрипт.

Возьмем простенький пример скрипта:ARV писал(а):а так же хотелось бы разобраться об аппаратной платформе, способной такое воспроизвести - я подозреваю, что это не atmega328 будет...
Код: Выделить всё
var arr = { 10, 20, 30, 40, 50 };
paint(2, (5 + 7 * 24 / 6) & 0x3F);
paintMap(arr);Спойлер
Код: Выделить всё
0000 E2000A pushk 11
0003 63 popv 3
0004 22 pushk5 2
0005 E020 pushk 33
0007 87 call paint
0008 43 pushv 3
0009 86 call paintMap
000A 16 ret
000B 05
000C 00
000D 0A
000E 14
000F 1E
0010 28
0011 32
Спойлер
Код: Выделить всё
bool process()
{
auto opcode = get();
switch (opcode >> 5)
{
case 0:
{
int tv = pop();
switch (opcode & 0x1F)
{
case 0x00: top() += tv; break; // Add
case 0x01: top() -= tv; break; // Sub
case 0x02: top() *= tv; break; // Mul
case 0x03: top() /= tv; break; // Div
case 0x04: top() %= tv; break; // Mod
case 0x05: push(-tv); break; // Neg
case 0x06: push(~tv); break; // Com
case 0x07: push(!tv); break; // Not
case 0x08: top() &= tv; break; // And
case 0x09: top() |= tv; break; // Or
case 0x0A: top() ^= tv; break; // Xor
case 0x0B: top() = bool(top()) & bool(tv); break; // LogAnd
case 0x0C: top() = bool(top()) | bool(tv); break; // LogOr
case 0x0D: top() >>= tv; break; // Ror
case 0x0E: top() <<= tv; break; // Rol
case 0x0F: top() = (top() == tv); break; // EQ
case 0x10: top() = (top() != tv); break; // NE
case 0x11: top() = (top() < tv); break; // LS
case 0x12: top() = (top() > tv); break; // GT
case 0x13: top() = (top() <= tv); break; // LE
case 0x14: top() = (top() >= tv); break; // GE
case 0x15: break; // Pop
case 0x16: return true; // Ret
}
break;
}
case 1: push(opcode & 0x1F); break; // Pushk5
case 2: push(vars_[opcode & 0x1F]); break; // Pushv
case 3: vars_[opcode & 0x1F] = pop(); break; // Popv
case 4: // Call
{
switch (opcode & 0x1F)
{
case 0: rtt.println(pop()); break; // void print(val)
case 1: peek(); break; // int peek(arrOffset, index)
case 2: clear(); break; // void clear(color)
case 3: wait(); break; // void wait(ms)
case 4: push(rnd()); break; // int rnd(max)
case 5: reverse(); break; // void reverse()
case 6: paintMap(); break; // void paintMap(arr)
case 7: paint(); break; // void paintMap(ledNum, color)
case 8: return true; // void exit()
.......
}
break;
}
case 5: // Jmp
{
int addr = ((opcode & 0x1F) << 8) | get();
curCode_ = (uint8_t*)Code + addr;
break;
}
case 6: // Jne
{
int addr = ((opcode & 0x1F) << 8) | get();
if (!pop()) curCode_ = (uint8_t*)Code + addr;
break;
}
case 7:
auto op = (opcode >> 3) & 3;
if (op == 0) // Pushk
{
bool sign = opcode & 1;
int nn = (opcode >> 1) & 3;
int val = get();
while (nn--)
{
val = (val << 8) | get();
}
val++;
if (sign) val = -val;
push(val);
}
else if (op == 1) // Addi
{
top() += (opcode & 7) + 1;
}
else // Subi
{
top() -= (opcode & 7) + 1;
}
}
return false;
}
uint8_t get() { return *curCode_++; }
int& top() const { return *curStack_; }
void push(int value) { *(++curStack_) = value; }
int pop() { return *curStack_--; }ps. Кому интересно может поиграться.
лучше один раз увидеть... есть какое-то видео, анимация или что-то подобное? как-то меня "квадратная спираль с бегущим огнем" не очень в голове вырисовывается...Reflector писал(а):Если взять такую полоску, разбить ее на 64 сегмента, свернуть в квадратную спираль и скролить, то получится именно то, что делает этот скрипт.
конечно, разве кто спорит? всю работу сделать на компьютере, а для МК по сути дать готовую "прошивку"Reflector писал(а):И мне кажется работать будет быстрее чем с твоими текстовыми скриптами
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=4186827#p4186827"]лучше один раз увидеть... есть какое-то видео, анимация или что-то подобное? как-то меня "квадратная спираль с бегущим огнем" не очень в голове вырисовывается...[/uquote]
Это тестовые примеры, реализовал что первое в голову пришло, просто чтобы проверить работоспособность. Не важно как оно выглядит, главное можно реализовывать эффекты обходя массив разными способами, без написании специализированных функций. Вот квадратная спираль:

Сверни так hsv полоску и скроль цвета по кругу, только у меня не лента и скрол достигается за счет изменения начального значения h.

Это тестовые примеры, реализовал что первое в голову пришло, просто чтобы проверить работоспособность. Не важно как оно выглядит, главное можно реализовывать эффекты обходя массив разными способами, без написании специализированных функций. Вот квадратная спираль:
Сверни так hsv полоску и скроль цвета по кругу, только у меня не лента и скрол достигается за счет изменения начального значения h.
Вопрос то был касательно того сможет ли mega328 такое воспроизвести и она сможет потратив меньше времени, RAM и флеша скорее всего тоже. И да, если хотя бы интерпретатор бейсика писался так просто, то изобретать свой "ассемблер" не было бы необходимостиARV писал(а):конечно, разве кто спорит? всю работу сделать на компьютере, а для МК по сути дать готовую "прошивку"думаешь, я не мог бы сделать подобное? мне было интересно сделать это на МК без компа. поначалу я хотел версию бейсика сделать, но потом передумал и сделал свой "ассемблер"
т.е. эта спираль реализована на матрице из светодиодов? и по ней бежит радуга - верно понял?Reflector писал(а):Вот квадратная спираль
да не было вопроса... я сразу сказал, что будет быстрее гораздо. я не сразу вспомнил, что у тебя подход "компилируемого" в байт-код скрипта. собственно, тут многое зависит от интерпретатора байт-кода, но наверняка он будет быстрее символьного интерпретатора...Reflector писал(а):Вопрос то был касательно того сможет ли mega328 такое воспроизвести и она сможет потратив меньше времени
а чего там сложного? подмножество бейсика для светоэффектов было бы не многим сложнее имеющегося интерпретатора "ассемблера"Reflector писал(а):если хотя бы интерпретатор бейсика писался так просто
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=4186870#p4186870"]т.е. эта спираль реализована на матрице из светодиодов? и по ней бежит радуга - верно понял?[/uquote]
Уже говорил, что сейчас вывод идет на SPI дисплей где рисуются 8x8 квадратов и нумерация там по рядам, а в массиве прописаны индексы спирали. Бежит радуга, да.
Cейчас у тебя шаблонный код, после команды интерпретатор ожидает, что должно идти два символа которые нужно интерпретировать как 8-ми битное число в hex и до разбора выражений ему очень далеко. А сколько ошибок можно сделать в таком выражении... И отлаживать придется на ПК, хотя бы чтобы эти ошибки увидеть и уже практически пропадает разница между написанием на ПК или написанием на ПК и компиляцией в байт-код, что гораздо эффективнее с точки зрения исполнения. Компилируются скрипты, кстати, за несколько тысячных секунды.
Уже говорил, что сейчас вывод идет на SPI дисплей где рисуются 8x8 квадратов и нумерация там по рядам, а в массиве прописаны индексы спирали. Бежит радуга, да.
Допустим интерпретатор "ассемблера" встречает подобное выражение:ARV писал(а):а чего там сложного? подмножество бейсика для светоэффектов было бы не многим сложнее имеющегося интерпретатора "ассемблера"просто меньше полезной памяти осталось бы, только и всего.
Код: Выделить всё
x = 10 * foo(rnd(y - 5) / 2, 8) + 1;так я тоже говорил, что лучше один раз увидеть... неужели телефон кнопочный без камеры?Reflector писал(а):же говорил
не, не допустим, в "ассемблере" таких выражений не может бытьReflector писал(а):Допустим интерпретатор "ассемблера" встречает подобное выражение
кэп, вы ли это?!Reflector писал(а):Компилируются скрипты, кстати, за несколько тысячных секунды
и плюсы, и минусы твоего варианта очевидны: при стрельбе по воробьям из пушки грохоту гораздо больше...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 47
- Зарегистрирован: Вс янв 02, 2011 21:02:02
Доброго всем времени суток!
Дилетантский вопрос: Собрал плейер в паре с светиками WS2812B в кол-ве 50 шт. При включении без SD флеш загорается красным медленно переходит в желтый-зеленый-голубой-синий-сиреневый - получается плейер норм работает? И еще как вытащить-записать скрипт с DSM, всю помощь перечитал не получаетсяи все,
с расширением .sc записывает, а внутри одни каракули.
Спасибо заранее!
Дилетантский вопрос: Собрал плейер в паре с светиками WS2812B в кол-ве 50 шт. При включении без SD флеш загорается красным медленно переходит в желтый-зеленый-голубой-синий-сиреневый - получается плейер норм работает? И еще как вытащить-записать скрипт с DSM, всю помощь перечитал не получаетсяи все,
с расширением .sc записывает, а внутри одни каракули.
Спасибо заранее!
да, это типа "дежурный" эффектuniko писал(а):При включении без SD флеш загорается красным медленно переходит в желтый-зеленый-голубой-синий-сиреневый - получается плейер норм работает?
понятия не имею, что у вас а проблема. файл в студию. вы СКРИПТ записываете или ПРОЕКТ? записывать надо СКРИПТ с расширением sc, а не проект.uniko писал(а):И еще как вытащить-записать скрипт с DSM, всю помощь перечитал не получаетсяи все,
с расширением .sc записывает, а внутри одни каракули.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 47
- Зарегистрирован: Вс янв 02, 2011 21:02:02
я не правильно сформулировал, световую анимацию для пробы сделал, как проект его сохранил, дальше не понял как это перевести в скрипт
uniko писал(а):всю помощь перечитал
а как же вот это в справке?uniko писал(а):световую анимацию для пробы сделал, как проект его сохранил, дальше не понял как это перевести в скрипт
- Вложения
-
- скрипт.PNG
- (53.08 КБ) 856 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 47
- Зарегистрирован: Вс янв 02, 2011 21:02:02
В принципе я также делаю, только в редакторе скрипта пусто, уже крыша поехала 
- Вложения
-
- скрипт.jpg
- (172.3 КБ) 265 скачиваний
посмотрите в настройках на закладке "Скрипт" - у вас, похоже, установлена галочка "Экспортировать только выделенный кадр", а кадр при этом не выделен...

Добавлено after 58 seconds:
рекомендую не ставить тут никакие галочки, кроме первой, пока не освоитесь
Добавлено after 58 seconds:
рекомендую не ставить тут никакие галочки, кроме первой, пока не освоитесь
- Вложения
-
- dsm_opt.PNG
- (9.19 КБ) 827 скачиваний
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 47
- Зарегистрирован: Вс янв 02, 2011 21:02:02
Нет, все так же. Сегодня еще раз скачал DSM, попробовал ее на диске С открыть, осталось попробовать на другом ПК или с другой виндой
Добавлено after 2 hours 6 minutes 23 seconds:
На ХР попробовал создать скрипт, такая же проблема, зато посмотрев dsm.log заметил странную вещь:
13:43:20.581: Работа начата
13:43:20.597: Палитра пользователя загружена из файла "default.dppf"
13:43:20.612: Выбрана максимальная скорость, для чего заблокировано обновление панели редактора и наблюдения
13:43:20.612: Файл рабочего пространства не указан, используется файл по умолчанию
13:43:20.612: Рабочее пространство загружено из файла "default.layout"
Я максимальную скорость не выбирал и не знаю где ее поменять. Может с этим связано глюки? Сейчас вообще некоторые кнопки не активны пока не перезагрузишь прогу
Добавлено after 2 hours 6 minutes 23 seconds:
На ХР попробовал создать скрипт, такая же проблема, зато посмотрев dsm.log заметил странную вещь:
13:43:20.581: Работа начата
13:43:20.597: Палитра пользователя загружена из файла "default.dppf"
13:43:20.612: Выбрана максимальная скорость, для чего заблокировано обновление панели редактора и наблюдения
13:43:20.612: Файл рабочего пространства не указан, используется файл по умолчанию
13:43:20.612: Рабочее пространство загружено из файла "default.layout"
Я максимальную скорость не выбирал и не знаю где ее поменять. Может с этим связано глюки? Сейчас вообще некоторые кнопки не активны пока не перезагрузишь прогу
да нет там никаких глюков
1. создали проект, разместили пикселы
2. нарисовали кадры анимации, проверили, что анимация вас удовлетворяет
3. открываете редактор скриптов
заходите в меню и жмете команду Импортировать анимацию в скрипт
4. вуаля!
выложите ваш проект, проверю у себя.
1. создали проект, разместили пикселы
2. нарисовали кадры анимации, проверили, что анимация вас удовлетворяет
3. открываете редактор скриптов
заходите в меню и жмете команду Импортировать анимацию в скрипт
4. вуаля!
выложите ваш проект, проверю у себя.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 47
- Зарегистрирован: Вс янв 02, 2011 21:02:02
Добрый день!
Я только учусь поэтому нет еще проектов, мне бы еще с железом разобраться, не поделитесь с скомпилированным HEX-файлом для прошивки микроконтроллера м328 для светиков WS2812b буду во многом благодарен.
Пробовал отсюда скачать но там не увидел HEX-файла https://cloud.mail.ru/public/P4CM%2FHBthmnjag
Скачал отсюда https://sites.google.com/view/digiscript/ вообще перестало SD читать только медленный переход всех цветов, до этого хоть считывало, но отличалось от тех готовых эффектов которые описаны.
Спасибо заранее!
Я только учусь поэтому нет еще проектов, мне бы еще с железом разобраться, не поделитесь с скомпилированным HEX-файлом для прошивки микроконтроллера м328 для светиков WS2812b буду во многом благодарен.
Пробовал отсюда скачать но там не увидел HEX-файла https://cloud.mail.ru/public/P4CM%2FHBthmnjag
Скачал отсюда https://sites.google.com/view/digiscript/ вообще перестало SD читать только медленный переход всех цветов, до этого хоть считывало, но отличалось от тех готовых эффектов которые описаны.
Спасибо заранее!


