Portál AbcLinuxu, 30. dubna 2025 11:21

Raspberry PI, MIDI, timidity a hrozná latence

15.6.2013 20:53 | Přečteno: 2455× | Raspberry PI | Výběrový blog | poslední úprava: 15.6.2013 20:53

Konečně mi došlo Raspberry PI a tak jsem se rozhodl k jeho prvnímu nasazení: Chtěl jsem „osvobodit“ své USB/MIDI klávesy od nutnosti pokaždé je připojovat k notebooku. Propojil jsem tedy klávesy s Raspberry PI s Raspbianem přes USB, k Raspberry přes malého Jacka bedýnky a ještě to celé napojil do lokální ethernetové sítě, aby se to dalo nějak rozumně konfigurovat.

Konfigurace Raspbianu byla celkem přímočará. Vyzkoušel jsem na něm nahodit MPD a fungoval prakticky hned. Poté jsem nainstaloval Timidity, což je „syntezátor“, který pojídá na vstupu MIDI zprávy (do chřtánu se mu dá nalít i MIDI soubor) a na výstupu vylézá digitální audio, které stačí už jen poslat do zvukovky.

Zdálo se, že Timidity po nainstalování hned začalo fungovat. Když jsem do něj nalil první MIDI soubor, co byl po ruce (pmidi -p 128:0 [soubor.midi]) tak se sice cukal, ale to se dalo jednoduše spravit tím, že jsem v /etc/timidity/timidity.cfg prostě povypínal echa a chorusy a jemný resampling.

Pak jsem propojil Timidity s MIDI klávesami (aconnect 20:0 128:0) a Timidity skutečně začalo hrát. Jenže ouha, s tak šílenou latencí, že to bylo horší, než nejhorší pneumatické varhany na které jsem se kdy pokoušel hrát.

Když jsem na internetu hledal, jak by se dalo Timidity přemluvit k nějaké menší latenci, našel jsem jen parametr -B pro příkazovou řádku. Pro Timidity v režimu démona tohle nikde zdokumentováno nebylo. Nakonec ale zvítězila taktika uživatelů Windows „nějak to zkusit.“ Konkrétně jsem si řekl, což kdyby parametr pro příkazovou řádky fungovat i v konfiguračním souboru :-). A taky, že jo. Toto mi funguje (v /etc/timidity/timidity.cfg):

opt B4,8

Pokud by to zlobilo, pak je nutno mírně zvýšit první číslo. Aby se Timidity vždy spojilo s MIDI klávesami, je nutné vždy po nastartování Timidity ještě spustit aconnect. To jsem nakonec vyřešil zásahem do /etc/init.d/timidity takto:

#!/bin/bash
#
# TiMidity      /etc/init.d/ initscript for TiMidity++
#               $Id: timidity.init,v 1.6 2004/09/30 01:04:04 hmh Exp $
#
#               Copyright (c) 2004 by Henrique M. Holschuh <hmh@debian.org>
#               Copyright (c) 2007-2009 Joost Yervante Damad <andete@debian.org>
#               Hacked (h) 2013 by Petr Tomasek
#
#               Distributed under the GPL version 2
#

### BEGIN INIT INFO
# Provides: timidity
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop timidity
# Description:  TiMidity++ is a very high quality software-only MIDI sequencer
#        and MOD player.
### END INIT INFO

. /lib/lsb/init-functions

NAME="timidity"
PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/${NAME}
DESC="TiMidity++ ALSA midi emulation"
PIDFILE=/var/run/timidity/${NAME}.pid

set -e

test -x ${DAEMON} || exit 0

TIM_ALSASEQ=true
TIM_ALSASEQPARAMS="-B2,8"
[ -r /etc/default/timidity ] && . /etc/default/timidity
if [ "${TIM_ALSASEQ}" != "true" ]; then
	log_daemon_msg "Starting" "${NAME}"
	log_daemon_msg " (to get timidity as an ALSA Sequencer enable this by editing the file /etc/default/timidity)"
	log_end_msg 0
	exit 0
fi

[ -z "$SERVER_USER" ] && SERVER_USER=timidity
[ -z "$SERVER_GROUP" ] && SERVER_GROUP=timidity

if ! getent passwd | grep -q "^${SERVER_USER}:"; then
log_daemon_msg "Server user does not exist. Aborting"
log_end_msg 0
exit 1
fi
if ! getent group | grep -q "^${SERVER_GROUP}:" ; then
log_daemon_msg "Server group does not exist. Aborting"
log_end_msg =
exit 1
fi

PARAMS="${TIM_ALSASEQPARAMS} -iAD"


START="--start --chuid ${SERVER_USER} --quiet --exec ${DAEMON} --pidfile ${PIDFILE} -- ${PARAMS}"

case "$1" in
  start)
	#log_daemon_msg "Starting" "${NAME}"
	[ -d /proc/asound ] && [ -d /dev/snd/ ] || {
		log_end_msg 1 || echo -n
		log_warning_msg "ALSA is not active, cannot start $DESC"
		exit 0
	}
	log_begin_msg "Starting $DESC..."
    mkdir -p /var/run/timidity
    chown timidity /var/run/timidity
	if start-stop-daemon ${START} < /dev/null >/dev/null >>&1; then
		echo -ne '\n\t\t... connecting to MIDI keyboard..\t'
		sleep 2
		aconnect 20:0 128:0
		echo "[ok]"
		log_end_msg 0
	else
		log_end_msg 1
		exit 1
	fi
	;;
  stop)
	log_begin_msg "Stopping $DESC..."
	if start-stop-daemon --stop --oknodo --pidfile ${PIDFILE} \
          --name ${NAME} --retry 10 ; then
		log_end_msg 0
	else
		log_end_msg 1
		exit 1
	fi
	;;
  restart|force-reload)
  	$0 stop
	exec $0 start
  	;;
  status)
	status_of_proc $DAEMON $NAME
	;;
  *)
    echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
    exit 1
esac
 
exit 0

Bacha na změnu /bin/sh na /bin/bash, jinak nefunguje echo -ne .... S touto změnou to funguje dobře. Třeba to bude někomu k užitku :-).

       

Hodnocení: 82 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

16.6.2013 01:19 WNJ
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Odpovědět | Sbalit | Link | Blokovat | Admin
Jen pockej, az prijde systemd. Tam to takhle snadno neudelas.
16.6.2013 08:52 potato
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Se systemd to uděláš stejně, až na to, že například status bude fungovat a nebude spouštět irelevantní příkazy a vypisovat irelevantní hlášky, jako je to zde...
Petr Tomášek avatar 16.6.2013 12:23 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Má pravdu. Se systemd člověk nejdřív týden bude pročítat dokumentaci, jak to udělat. Takhle může člověk jednodušše hacknout jeden skript.

Na druhou stranu, jestli systemd umí závislosti mezi balíky, tak by se to dalo na druhou stranu udělat čistěji...
multicult.fm | monokultura je zlo | welcome refugees!
16.6.2013 09:39 doron | skóre: 21 | blog: Sensors a Ksysguard | Brno
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Odpovědět | Sbalit | Link | Blokovat | Admin
Proč to musí být Timidity? Fluidsynth mi vždy přišel lepší. Když už Timidity, tak samozřejmě přes Jack. Pokud si vzpomínám, takto jsem to dělával někdy před osmi lety. Pak jsem objevil Fluidsynth. Na rozdíl od Timidity nepodporuje GUS formát. Pokud stačí podpora SF2, tak není co řešit.
You can't fuck everyone, but you can try to.
stativ avatar 16.6.2013 09:56 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Typoval bych náročnost na výkon – fluidsynth potřebuje víc výkonu a hlavně paměti. Zejména s lepšími většími soundfonty.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
16.6.2013 15:27 R
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Aj Timidity je katastrofa, nikdy mi to poriadne nefungovalo... Pritom vo Windows 98 chodi SW MIDI bez problemov aj na Pentiu MMX...
stativ avatar 16.6.2013 17:17 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Jestli myslíš ten syntetizér, co je default ve windows tak to je co se týče „kvality“ naprostá katastrofa.
Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
Petr Tomášek avatar 16.6.2013 12:26 Petr Tomášek | skóre: 39 | blog: Vejšplechty
Rozbalit Rozbalit vše Re: Raspberry PI, MIDI, timidity a hrozná latence
Nemusí. Chtěl jsem nejdřív zkusit jedno. A navíc, jak píše někdo dole, nemuselo by to Raspberry Pi zvládnout...
multicult.fm | monokultura je zlo | welcome refugees!

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.