Pixilang
Pixilang - пиксельно-ориентированный язык программирования для небольших графических и звуковых экспериментов. Концепция Pixilang разработана в 2006 году Александром Золотовым (NightRadio) и Михаилом Разуваевым (Goglus). Pixilang открытый (распоространяется по MIT License) и кросс-платформенный.
Versions
1.6
Pixilang 1.6 (14 августа 2008) — последняя стабильная из ветки 1.x. Работает в операционных системах GNU/Linux, Microsoft Windows, Microsoft Windows CE и PalmOS. Распространяется под лицензией BSD License (основная часть) и GNU General Public License (библиотеки GIF и XM).
2.0
Pixilang 2.0 (14 августа 2008) — экспериментальная версия; по функционалу полностью идентична версии 1.6, но имеет встроенный JIT компилятор для повышения производительности на платформе x86. Запускается только в Linux и Windows.
3
Pixilang 3 — новая версия языка, переписанная практически с нуля. В ней устранены некоторые недостатки предыдущих версий и добавлены новые возможности. Версия 3 совместима с 1.6 и 2.0 лишь частично.
Основные отличия от предыдущих версий:
- переменная может хранить либо целое число, либо число с плавающей точкой (floating point);
- появились локальные переменные (активны только в рамках одной функции); отличаются символом $, стоящим перед именем;
- язык портирован на OSX, iOS и Android;
- появилась возможность вызова функций из динамических библиотек операционной системы.
Ключевые особенности версии 3
- простые правила, низкий порог вхождения;
- программу можно писать без объявления функций, просто списком инструкций с условными переходами;
- сразу после старта программе выделяется чистый экран (или окно), к которому можно обращаться как к массиву пикселей, или использовать готовые граф. примитивы;
- универсальные контейнеры (pixi-контейнеры) для хранения любых типов данных;
- функции для синтеза и записи звука;
- функции для обработки блоков данных;
- поддерживаемые форматы файлов (загрузка и сохранение): WAV, PNG, JPEG, GIF (анимированный);
- поддерживаемые звуковые системы: ASIO, DirectSound, MME, ALSA, OSS, JACK (для iOS и Linux);
- поддержка внешних динамических библиотек (нативный код);
- OpenGl ускорение;
- MIDI In/Out.
Обзор языка
Pixilang-программы хранятся в текстовых файлах (UTF8) с расширением .txt или .pixi. Поэтому вы можете использовать любой текстовый редактор для создания таких программ. Pixilang не имеет встроенного редактора. После старта появляется файловый диалог, в котором нужно указать, где лежит запускаемая pixi-программа.
В основе Pixilang - контейнеры (или pixi-контейнеры, как их иногда называют) и переменные.
Контейнер - это двумерный массив, таблица из X колонок и Y строк. Каждая ячейка этой таблицы - число определенного формата. Формат задан один на весь контейнер. Например, ячейки могут хранить цвета пикселей, тогда контейнер превращается в картинку. Контейнер с таким же успехом может быть строкой текста, куском звука и т.д. По аналогии с другими языками программирования контейнер можно считать массивом, состоящим из (X*Y) ячеек. Каждый контейнер после создания имеет свой порядковый номер.
Структура контейнера:
- двумерный массив (таблица) элементов контейнера;
- key color - цвет, который будет отображаться, как прозрачный;
- ссылка на контейнер (должен быть типа INT8) с альфа-каналом - для изображений с плавными изменениями прозрачности;
- дополнительные данные:
- свойства (используйте функции get_prop(), set_prop(), remove_props() или оператор . (точка) для доступа к ним);
- анимация (используйте функции для анимации контейнеров).
Новый контейнер можно получить используя функцию new() или какую-то другую специальную функцию, возвращающую блок данных. Контейнер удаляется двумя способами:
- пользователем при помощи функции remove();
- автоматически после завершения программы.
В Pixilang отсутствует автоматический сборщик мусора, поэтому будьте внимательны - каждый новый контейнер отнимает память до тех пор, пока вы не удалите этот контейнер.
Переменная - имя ячейки памяти, в которой хранится одно знаковое целое 32-битное число (например, 25) или 32-битное число с плавающей запятой (например, 33.44). Локальные переменные (с символом $ перед именем) доступны только в рамках одной функции, в которой эти переменные определены. Глобальные переменные (без символа $) доступны в любом месте программы.
Числа можно описывать в различных форматах. Примеры:
- 33 - обычное целое десятичное;
- 33.55 - десятичное с плавающей запятой;
- 0xA8BC - шестнадцатеричное;
- 0b100101011 - двоичное;
- #FF9080 - цвет, как в HTML; общий формат такой: #RRGGBB, где RR - яркость красного, GG - яркость зеленого; BB - яркость голубого.
В каком бы формате вы не описали число, внутри Pixilang оно все равно будет 32-битным целым или 32-битным с плавающей запятой.
Примеры контейнеров
x = new( 4 ) //Создаем контейнер из 4х пикселей. Сохраняем номер контейнера в переменной x.
x[ 2 ] = WHITE //Присваиваем пикселю номер 2 белый цвет.
remove( x ) //Удаляем контейнер
c = new( 4, 4 ) //Создаем 2D контейнер 4 на 4 пикселя. Сохраняем номер контейнера в переменной c.
c[ 2, 2 ] = WHITE //Присваиваем пикселю с координатами 2,2 белый цвет.
remove( c ) //Удаляем контейнер
str = "Hello" //"Hello" - это строковый контейнер, состоящий из пяти 8-битных символов (кодировка UTF-8).
//Подобные контейнеры-строки создаются автоматически на этапе компиляции программы.
//Удалять их вручную так, как это сделано в предыдущем примере, не надо.
//Контейнеру со строкой "Hello" автоматически присвоится порядковый номер.
//Например, это будет номер 4.
//Тогда код str = "Hello" будет равноценен коду str = 4.
str[ 0 ] = 'h' //Меняем самую первую букву в строке. Было - 'H'. Станет - 'h'.
a = 4 //Глобальная переменная
fn function()
{
$k = 2 //Локальная переменная
function2 = {
//Определяем еще одну функцию
$x = 899.334 //Локальная переменная
//В этом месте $k недоступна, т.к. находится в другой функции
}
//В этом месте $x недоступна
}
//В этом месте $k и $x недоступны
Встроенные операторы
If, Else
if a == b
{ /*Код в этом месте выполняется, если a равно b*/ }
else
{ /*Код в этом месте выполняется в противном случае (a не равно b)*/ }
if x == 4 && y == 2
{ /*Код в этом месте выполняется, если x равно 4 и y равно 2*/ }
While
a = 0
while( a < 3 )
{
//Код в этом месте выполняется, если a меньше 3
a + 3
}
While + Break
a = 0
while( a < 100 )
{
//Код в этом месте выполняется, если a меньше 100
if a == 10 { break } //Если a = 10, то разрываем цикл оператором break
//Для остановки нескольких вложенных циклов сразу можно использовать оператор breakX,
//где X - глубина. Например break2 остановит два цикла.
//А при помощи оператора breakall можно остановить все циклы,
//которые активны в данный момент для текущего потока выполнения.
a + 1
}
While + Continue
a = 0
b = 0
while( a < 100 )
{
//Код в этом месте выполняется, если a меньше 100
if a == 10 { a + 1 continue } //Если a = 10, то переходим к следующей итерации цикла
// (игнорируем следующие две строчки кода)
a + 1
b + 1
}
Go, Goto
m1:
a + 1
goto m1 //Переход на метку m1
Halt, Stop
halt //В этом месте программа останавливается
Include
include "prog2.txt" //В этом месте подключаем код из файла prog2.txt
fn
fn fff( $x, $y ) //Определяем функцию fff с параметрами $x и $y
{
//Код функции fff
ret //Простой выход из функции
ret( 4 ) //Выход из функции с возвращением значения 4
}
Ниже приведена таблица математических операторов. Приоритет 0 - наивысший, такие операции будут выполняться в первую очередь.
Приоритет | Оператор | Описание | Результат | Пример |
---|---|---|---|---|
0 | % | Деление по модулю | Целое число | a = b % 4 |
0 | / | Деление | Число с плавающей запятой | a = b / 4 |
0 | div | Целочисленное деление | Целое число | a = b div 4 |
0 | * | Умножение | Зависит от операндов | a = b * 4 |
1 | + | Сложение | Зависит от операндов | a = b + 4 |
1 | - | Вычитание | Зависит от операндов | a = b - 4 |
2 | >> | Битовый сдвиг вправо | Целое число | a = b >> 4 |
2 | << | Битовый сдвиг влево | Целое число | a = b << 4 |
3 | == | Равно | Целое число 1 или 0 | if a == b {} |
3 | != | Не равно | Целое число 1 или 0 | if a != b {} |
3 | < | Меньше | Целое число 1 или 0 | if a < b {} |
3 | > | Больше | Целое число 1 или 0 | if a > b {} |
3 | <= | Меньше или равно | Целое число 1 или 0 | if a <= b {} |
3 | >= | Больше или равно | Целое число 1 или 0 | if a >= b {} |
4 | | | Побитовая операция ИЛИ (OR) | Целое число | a = b | 4 |
4 | ^ | Побитовая операция исключающего ИЛИ (XOR) | Целое число | a = b ^ 4 |
4 | & | Побитовая операция И (AND) | Целое число | a = b & 4 |
5 | || | Логическая операция ИЛИ (OR) | Целое число 1 или 0 | if a || b {} |
5 | && | Логическая операция И (AND) | Целое число 1 или 0 | if a && b {} |
Примеры кода
Простые примеры программ для Pixilang 3:
//Пример загрузки и вывода на экран картинки из файла:
img = load( "image.jpg" )
s: pixi( img )
frame()
go s
//Вывод картинки на экран с масштабированием и перекрашиванием в зеленый цвет:
img = load( "image.jpg" )
s: pixi( img, 0, 0, GREEN, 2, 2 )
frame()
go s
//Пример загрузки и воспроизведения GIF-анимации:
img = load( "animation.gif" )
play( img )
s: pixi( img )
frame()
go s
Here is also a basic example for Pixilang V1.6 or V2.0:
//Простой анимационный пример для Pixilang 1.6 или 2.0
//Запишем цвет #003050 в переменную o
o = #003050
//Опишем анимированную картинку (pixi),
//состоящую из двух кадров:
logo = "
.o...ooo...o.
..o..o.o..o..
...ooooooo...
...ooooooo...
.ooooooooooo.
.o.ooooooo.o.
oo.........oo
+
.o...ooo...o.
..o..o.o..o..
...ooo.ooo...
...ooooooo...
.ooooooooooo.
.o.ooooooo.o.
oo.........oo
"
//Теперь заставим язык преобразовать эту картинку
//из текстового вида в графический:
make_pixi( logo )
//В этой переменной будем хранить коэффициент увеличения:
zm = 20
//Метка:
start:
//Устанавливаем прозрачность 64:
transp( 64 )
//Стираем экран белым цветом. Слегка стираем,
//так как установлена прозрачность 64:
clear( #FFFFFF )
//Устанавливаем прозрачность 256 (непрозрачный):
transp( 256 )
//Рисуем нашу картинку logo по координатам 0,0 с увеличением zm:
pixi( logo, 0, 0, zm )
//Уменьшаем увеличение на единицу:
zm - 1
//Выводим результат на экран и ждем 100 миллисекунд:
frame( 100 )
//Переходим на метку start:
go start
Результат можно увидеть здесь
Приложения, созданные при помощи Pixilang
- Virtual ANS - инструмент (графический редактор) для рисования микротональных/спектральных музыкальных произведений с неповторимым космическим звучанием, а также для игры со спектром в реальном времени.
- PixiTracker - простой инструмент для музыкальных зарисовок, чип-тюнов и звуковых экспериментов. Специальных знаний для работы с программой не требуется!
- PixiVisor - это инструмент для аудио-визуальных экспериментов. Программа состоит из двух частей: Передатчик (Transmitter) и Приемник (Receiver). Передатчик конвертирует видео (с камеры, из картинки или GIF-анимации) в звук попиксельно (построчное сканирование) в реальном времени. То есть, вы слышите ваше изображение. Основная же функция передатчика - посредством звука транслировать видео-сигнал на принимающие устройства. Приемник конвертирует звук (он берет его с микрофона или с линейного входа) обратно в изображение, которое можно легко изменять (менять палитру, контраст и т.д.).
- Soul Resonance - аудио-визуальный альбом
- Синтезаторы:
- PixelWave - экспериментальный синтезатор с пиксельным интерфейсом
- SpectrumGen - похож на PixelWave, но ещё можно рисовать звуковой спектр
- Видео Northern Forests и Dragon's Game - на Pixilang написана программа для рендеринга
Ссылки
- Официальный сайт проекта
- Документация
- Pixilang на Wikibooks - наполнение информацией лучше, чем в английской версии