Pixilang

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:43, 8 июня 2016.

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

  1. Virtual ANS - инструмент (графический редактор) для рисования микротональных/спектральных музыкальных произведений с неповторимым космическим звучанием, а также для игры со спектром в реальном времени.
  2. PixiTracker - простой инструмент для музыкальных зарисовок, чип-тюнов и звуковых экспериментов. Специальных знаний для работы с программой не требуется!
  3. PixiVisor - это инструмент для аудио-визуальных экспериментов. Программа состоит из двух частей: Передатчик (Transmitter) и Приемник (Receiver). Передатчик конвертирует видео (с камеры, из картинки или GIF-анимации) в звук попиксельно (построчное сканирование) в реальном времени. То есть, вы слышите ваше изображение. Основная же функция передатчика - посредством звука транслировать видео-сигнал на принимающие устройства. Приемник конвертирует звук (он берет его с микрофона или с линейного входа) обратно в изображение, которое можно легко изменять (менять палитру, контраст и т.д.).
  4. Soul Resonance - аудио-визуальный альбом
  5. Синтезаторы:
    • PixelWave - экспериментальный синтезатор с пиксельным интерфейсом
    • SpectrumGen - похож на PixelWave, но ещё можно рисовать звуковой спектр
  6. Видео Northern Forests и Dragon's Game - на Pixilang написана программа для рендеринга

Ссылки

  1. Официальный сайт проекта
  2. Документация
  3. Pixilang на Wikibooks - наполнение информацией лучше, чем в английской версии