MIDI: Превращаем сообщения в нажатия кнопок клавиатуры

Категории: HowTo

Как конвертировать сообщения от midi-клавиатуры в нажатия кнопок на клавиатуре?

Где это может потребоваться - это в приложениях, которые не умеют в миди, но умеют в хоткеи. Например musescore - это приложение очень плохо умеет в миди.

Создадим простейший скрипт midi-to-keyboard. Все что он делает - это слушает события на шине и транслирует их в нажатия кнопок клавиатуры.

#!/usr/bin/env bash
THROTTLE=150
old_time=0
last_change=0
#aseqdump -p "Arturia MiniLab mkII" | \
aseqdump -p "System" | \
while IFS=" ," read src ev1 ev2 ch label1 data1 label2 data2 rest; do
    current_time=$(($(date +%s%N)/1000000))
    diff=$(($current_time-$old_time))
    if [[ $diff -gt $THROTTLE && "$ch" = 15 ]]; then
        # тротлинг событий обязателен
        change=0
        case $data1 in
            48 ) # effects 1
                if [[ $data2 -gt 64 ]]; then
                    xdotool key Right
                    change=1
                elif [[ $data2 -lt 64 ]]; then
                    xdotool key Left
                    change=1
                fi
            ;;
            49 ) # effects 2
                if [[ $data2 -gt 64 ]]; then
                    xdotool key Up
                    change=1
                elif [[ $data2 -lt 64 ]]; then
                    xdotool key Down
                    change=1
                fi
            ;;
        esac
        if [[ change -eq 1 ]]; then
            echo "Change after $(($current_time-$old_time))"
            old_time=$current_time
        fi
    fi
done

Литература:

PulseAudio: Перенаправление потоков аля jackd

Категории: HowTo

Что мы хотим? Мы хотим подмешать к микрофонному сигналу еще что-то. Например дополнительный сигнал с другой звуковой карты для того, чтобы по скайпу с кем-то поджемить на гитаре\ударке.

В jackd это сделать довольно просто - там куча графических роутеров. Но что делать если надо подмешать сигнал в pulse?

Возьмем самый простой пример: нужно подмешать к звуку микрофона аудио из браузера.

mic -> skype <- ff

Просто так это работать не будет. Потребуется виртуальное loopback-устройство, которое будет смешивать сигналы, а после остальное по будет использовать его как микрофон.

skype ^ |mic -> loopback <- ff

1 - Создаем устройство

Создаем само устройство и задаем ему описание чтобы в панели управления бло что-то вразумительное, а не “Пустой выход”.

$ pacmd load-module module-null-sink sink_name=fx-sink 42 $ pacmd update-sink-proplist fx-sink device.description=Виртуальный_микрофон_вход $ pacmd update-source-proplist fx-sink.monitor device.description=Виртуальный_микрофон_выход

Цифру, которая выдает первая команда можно запомнить. Это идентификатор, по которому можно sink удалить.

2 - Перенаправляем микрофонный выход на это устройство

$ pactl load-module module-loopback source=alsa_input sink=fx-sink 43

Номер так же можно запомнить чтобы потом удалить ассоциацию.

Теперь в качестве устройства для ввода в панели управления (ставим как дефолтный девайс) или в программе выбираем fx-sink.monitor. Он будет называться “Виртуальный_микрофон_выход” (выше мы прописали в описании).

Чтобы посмотреть что писать в аргументе source просматриваем вывод команды

$ pactl list-sinks

Тут нам нужно найти содержимое поля name системного микрофона.

Источники:

Jackd: Измеряем задержку аудио сигнала в цепочке обработки

Категории: HowTo

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

Но что на самом деле означает эта задержка? Это лишь время, которое будет затрачено на обработку сигнала после поступления его в роутер (в моем случае в роли роутера выступает jackd).

А как измерить полную задержку вместе со временем на обработку и перевод сигнала в аналог?

jack_iodelay - утилита генерирует тестовый сигнал, который можно направить в роутере куда угодно, потом вернуть на вход этой же утилиты и посмотреть в консоли что получится.

Для измерения нам потребуется небольшой патч чтобы соединить один из входов интерфейса с выходом.

После этого запускаем утилиту, коммутируем нужный вход и выход в роутере и смотрим на результат в консоли.

Показатели задержки сигнала

Общая задержка составляет в среднем 820 фреймов. Чтобы узнать задержку в миллисекундах делим это число на частоту семплирования. (96кГц). Это 8,5мс.

Поле extra loopback latency содержит лаг, который был вызван ЦАП’ом и АЦП.

Задержка зависит и от настроек джека. От количества семплов и периодов на буфер

Для текущего теста 2 периода на буфер и 128 сэмплов. Итого 384. И ~430 фреймов - это задержка на железе. В сумме и получается ~820.

Можно пользоваться опциям -I и -O. Они отдельно позволяют посмотреть задержку по входу и выходу сигнала.

Linux: Настраиваем МФУ pantum

Категории: HowTo

Есть такие новые китайские принтеры (относительноо новые) Pantum. В них и wifi, и поддержка linux из коробки. Достал я и себе такое чудо платы лутом делать и шаблоны для фоторезиста печатать.

Настроить wifi в принтере (если он есть) без смартфона не получится - лезем туда и делаем все по инструкции (она с картинками).

Теперь надо поставить драйвера и настроить сканирование и печать по wifi. Если у вас убунту или дебиан, то драйвера скачиваются и устанавливаются в виде пакета. Если федора, то придется немного покомпилировать.

Пакеты для fedora

Предварительно потребуется собрать библиотеку libjpeg so.8. Иначе вы не сможете поставить sane-драйвера.

nothing provides libjpeg so.8()(64bit) needed by pantum-m6xxx-sane-1 4 0-2 fc28 x86_64
$ sudo dnf install rpm-build spectool git
$ rpmdev-setuptree
$ git clone https://github.com/RussianFedora/compat-libjpeg8.git
$ cd compat-libjpeg8
$ spectool --all --get-files --directory ~/rpmbuild/SOURCES compat-libjpeg8.spec
$ rpmbuild -bb compat-libjpeg8.spec
$ sudo dnf install ~/rpmbuild/RPMS/$(uname -m)/compat-libjpeg8-1.5.3-3.fc32.x86_64.rpm

А теперь можно собирать и ставить драйвера для pantum.

$ sudo dnf install rpm-build spectool git
$ rpmdev-setuptree
$ git clone https://github.com/EasyCoding/pantum-m6xxx.git
$ cd pantum-m6xxx
$ spectool --all --get-files --directory ~/rpmbuild/SOURCES pantum-m6xxx.spec
$ rpmbuild -bb pantum-m6xxx.spec
$ sudo dnf install ~/rpmbuild/RPMS/$(uname -m)/pantum-m6xxx-*.rpm

Настройка cups

Заходим в веб-интерфейс и добавляем принтер. Никаких сложностей нет.

Настройка sane

Тут сложнее. Ставим sane-backend, а потом добавляем удаленный сканер.

sudo dnf install sane-backends-daemon

Добавляем в /etc/sane.d/dll.conf

pantum6500
pantum_mfp

Получаем доменный адрес принтера через avahi. Я уже писал о том, как работать без локального днс.

$ avahi-browse-domains -alr

Среди полученных адресов вы увидите адрес принтера Pantum-XXXXXX.local. Этот адрес надо добавить в /etc/sane.d/net.conf.

Запускаем saned.

$ sudo systemctl start saned.socket

Проверяем наличие сканера.

$ scanimage -L 
device `v4l:/dev/video0' is a Noname HD WebCam: HD WebCam virtual device 
device `airscan:e0:Pantum M6500W series[XXXXX]' is a eSCL Pantum M6500W series[XXXXX] eSCL network scanner

Литература

Ошибка юнита systemd-modules-load.service

Категории: linux
Узнаем почему не загружается vboxdrv и починим.