mitglieder
24
Bearbeitungen
Zoredh (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „{{Infobox Projekt |name = MidiPiSynth |status = beta |beschreibung = ein kleiner Synthesizer mit Raspberry Pi |autor = Zoredh…“) |
Zoredh (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 36: | Zeile 36: | ||
Anschließend müssen die Paket-Sourcen aktualisiert werden, damit die noch benötigten Komponenten installiert werden können: | Anschließend müssen die Paket-Sourcen aktualisiert werden, damit die noch benötigten Komponenten installiert werden können: | ||
sudo apt update | |||
==Weitere Konfiguration== | ==Weitere Konfiguration== | ||
Da ich ungerne mit "nano" editiere oder händisch durch Verzeichnisse wusele, installierte ich mir als erstes einen vernünftigen Editor und den allseits beliebten Midnight-Commander: | Da ich ungerne mit "nano" editiere oder händisch durch Verzeichnisse wusele, installierte ich mir als erstes einen vernünftigen Editor und den allseits beliebten Midnight-Commander: | ||
sudo apt install vim mc | |||
Anschließend muss die interne Soundkarte unbedingt deaktiviert werden: | Anschließend muss die interne Soundkarte unbedingt deaktiviert werden: | ||
sudo /boot/config.txt | |||
Die letzte Zeile muss hier auskommentiert werden: | Die letzte Zeile muss hier auskommentiert werden: | ||
#dtparam=audio=on | |||
==Installation der benötigten Software== | ==Installation der benötigten Software== | ||
Zeile 59: | Zeile 59: | ||
Hier wird eine Datei angepasst: | Hier wird eine Datei angepasst: | ||
sudo vim /etc/dbus-1/system.d/org.freedesktop.systemd1.conf | |||
oder | oder | ||
sudo nano /etc/dbus-1/system.d/org.freedesktop.systemd1.conf | |||
Unter dem Block <policy user="root">... </policy> muss folgender Block eingefügt werden: | |||
<policy user="pi"> | <policy user="pi"> | ||
<allow own="org.freedesktop.ReserveDevice1.Audio0"/> | <allow own="org.freedesktop.ReserveDevice1.Audio0"/> | ||
<allow own="org.freedesktop.ReserveDevice1.Audio1"/> | <allow own="org.freedesktop.ReserveDevice1.Audio1"/> | ||
</policy> | </policy> | ||
==Konfiguration und Skripte== | ==Konfiguration und Skripte== | ||
===JACK=== | ===JACK=== | ||
Anlegen der Datei /home/pi/.jackdrc mit folgendem Inhalt: | Anlegen der Datei /home/pi/.jackdrc mit folgendem Inhalt: | ||
/usr/bin/jackd -T -R -P35 -dalsa -dhw:0,0 -r44100 -p256 | |||
-T nach dem Trennen der letzten Instanz JACK beenden | -T nach dem Trennen der letzten Instanz JACK beenden | ||
-R -P35 Realtime mit der Priorität 35 (mit der Priorität kann man ruhig etwas rumspielen | -R -P35 Realtime mit der Priorität 35 (mit der Priorität kann man ruhig etwas rumspielen | ||
-dalsa -dhw0:0 Als Output die erste Soundkarte via ALSA verwenden | -dalsa -dhw0:0 Als Output die erste Soundkarte via ALSA verwenden | ||
-r44100 Sample-Rate an Fluidsynth anpassen | -r44100 Sample-Rate an Fluidsynth anpassen | ||
-p256 maximale Anzahl der Ports festlegen (256 reichen locker aus) | -p256 maximale Anzahl der Ports festlegen (256 reichen locker aus) | ||
Zeile 88: | Zeile 88: | ||
* Anlegen des Start-Skripts für Fluidsynth "/home/pi/bin/fs" | * Anlegen des Start-Skripts für Fluidsynth "/home/pi/bin/fs" | ||
#!/bin/bash | |||
#DBUS-Problem ohne XServer | |||
export JACK_NO_AUDIO_RESERVATION=1 | |||
# | #Starte Fluidsyntkript | ||
fluidsynth -l -s -a jack -j -i -f /home/pi/bin/fs.cfg /usr/share/sounds/sf2/FluidR3_GM.sf2 & | |||
# | #Warte bis sich wenigstens ein Gerät verbindet | ||
while ! /home/pi/bin/condev &>/dev/null; do sleep 1;done | |||
* Anlegen der Konfigurationsdatei "/home/pi/bin/fs.cfg" (ich habe hier die Lautstärke auf 2 und für den ersten Channel ein Banjo gewählt) | * Anlegen der Konfigurationsdatei "/home/pi/bin/fs.cfg" (ich habe hier die Lautstärke auf 2 und für den ersten Channel ein Banjo gewählt) | ||
gain 2 | |||
prog 0 105 | prog 0 105 | ||
===ALSA=== | ===ALSA=== | ||
Da man über ALSA nur einen Sound zur gleichen Zeit abspielen kann, bauen wir eine Brücke zu JACK, so dass die Ausgaben alle via JACK zu ALSA laufen. Dazu legen wir die Datei /home/pi/.asoundrc mit folgendem Inhalt an: | Da man über ALSA nur einen Sound zur gleichen Zeit abspielen kann, bauen wir eine Brücke zu JACK, so dass die Ausgaben alle via JACK zu ALSA laufen. Dazu legen wir die Datei /home/pi/.asoundrc mit folgendem Inhalt an: | ||
pcm.rawjack { | |||
type jack | type jack | ||
playback_ports { | playback_ports { | ||
Zeile 118: | Zeile 118: | ||
1 system:capture_2 | 1 system:capture_2 | ||
} | } | ||
} | } | ||
pcm.jack { | pcm.jack { | ||
type plug | type plug | ||
slave { pcm "rawjack" } | slave { pcm "rawjack" } | ||
Zeile 126: | Zeile 126: | ||
description "JACK Audio Connection Kit" | description "JACK Audio Connection Kit" | ||
} | } | ||
} | } | ||
pcm.!default { | pcm.!default { | ||
type plug | type plug | ||
slave { pcm "rawjack" } | slave { pcm "rawjack" } | ||
} | } | ||
Um nicht jedes Mal mit aconnect schauen zu müssen, welche ID die Midi-Geräte haben, habe ich ein Script angelegt, welches diesen aconnect automatisch macht | Um nicht jedes Mal mit aconnect schauen zu müssen, welche ID die Midi-Geräte haben, habe ich ein Script angelegt, welches diesen aconnect automatisch macht | ||
Zeile 136: | Zeile 136: | ||
* Anlegen des Skripts /home/pi/bin/condev (ich gebe mit ogg123 noch einen Sound aus, weil später kein Bildschirm vorhanden sein muss) | * Anlegen des Skripts /home/pi/bin/condev (ich gebe mit ogg123 noch einen Sound aus, weil später kein Bildschirm vorhanden sein muss) | ||
#!/bin/bash | |||
/usr/bin/aconnect -i|/usr/bin/awk '/client.*card=/ {print $2}'| while read INPUT | /usr/bin/aconnect -i|/usr/bin/awk '/client.*card=/ {print $2}'| while read INPUT | ||
do | do | ||
/usr/bin/aconnect ${INPUT}0 128 && /usr/bin/ogg123 -q /home/pi/sound/in.oga | /usr/bin/aconnect ${INPUT}0 128 && /usr/bin/ogg123 -q /home/pi/sound/in.oga | ||
done | done | ||
exit $? | exit $? | ||
* Ausführbarmachen der Skripte | * Ausführbarmachen der Skripte | ||
chmod -R +x /home/pi/bin/* | |||
==Vorbereitungen für den Betrieb ohne Monitor (headless)== | ==Vorbereitungen für den Betrieb ohne Monitor (headless)== | ||
Zeile 152: | Zeile 152: | ||
Ganz am Ende folgende Zeile für den Automatischen Start einfügen (der erste Teil vor den zwei || verhindert das starten bei einer zweiten Shell): | Ganz am Ende folgende Zeile für den Automatischen Start einfügen (der erste Teil vor den zwei || verhindert das starten bei einer zweiten Shell): | ||
ps-e|grep -q fluid || /home/pi/bin/fs | |||
===USB-Geräte-Erkennung und Anbindung=== | ===USB-Geräte-Erkennung und Anbindung=== | ||
Die Automatische Erkennung findet über UDEV statt - hierzu braucht man nur folgende die Datei /etc/udev/rules.d/80-mididev.rules mit folgendem Inhalt anzulegen: | Die Automatische Erkennung findet über UDEV statt - hierzu braucht man nur folgende die Datei /etc/udev/rules.d/80-mididev.rules mit folgendem Inhalt anzulegen: | ||
ACTION=="add", SUBSYSTEM=="usb", RUN+="/bin/su - pi /home/pi/bin/condev" | |||
Dadurch wird jetzt immer condev aufgerufen, dass die Geräte via aconnect mit fluidsynth verbindet | Dadurch wird jetzt immer condev aufgerufen, dass die Geräte via aconnect mit fluidsynth verbindet | ||
Zeile 167: | Zeile 167: | ||
Ein kleines Pythonscript "/home/pi/bin/shutdown.py" muss mit folgendem Inhalt angelegt werden: | Ein kleines Pythonscript "/home/pi/bin/shutdown.py" muss mit folgendem Inhalt angelegt werden: | ||
#! /usr/bin/env python | |||
import os | import os | ||
import RPi.GPIO as GPIO | import RPi.GPIO as GPIO | ||
GPIO.setmode(GPIO.BCM) | GPIO.setmode(GPIO.BCM) | ||
# GPIO3 (pin 5) set up as input. It is pulled up to stop false signals | # GPIO3 (pin 5) set up as input. It is pulled up to stop false signals | ||
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP) | GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP) | ||
try: | try: | ||
while True: | while True: | ||
# wait for the pin to be sorted with GND and, if so, halt the system | # wait for the pin to be sorted with GND and, if so, halt the system | ||
Zeile 179: | Zeile 179: | ||
# shut down the rpi | # shut down the rpi | ||
os.system("/sbin/shutdown -h now") | os.system("/sbin/shutdown -h now") | ||
except: | except: | ||
GPIO.cleanup() | GPIO.cleanup() | ||
* Anschließend muss dieses ausführbar gemacht werden mit: | * Anschließend muss dieses ausführbar gemacht werden mit: | ||
chmod +x /home/pi/bin/shutdown.py | |||
Damit der Computer darauf reagieren kann, muss dieses Script beim Start werden. Hierzu editiert man die /etc/crontab: | Damit der Computer darauf reagieren kann, muss dieses Script beim Start werden. Hierzu editiert man die /etc/crontab: | ||
@reboot root /usr/bin/python /home/pi/bin/shutdown.py | |||
===Hardware=== | ===Hardware=== |