PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tone library auch für Raspi



HaWe
05.10.2016, 13:06
hallo,
durch Stöbern in einigen Raspi- und Arduino-Foren bin ich auf eine wünschenswerte Ergänzung gestoßen, die auch für den raspi schön wäre:
eine Lib, um Töne aus dem Stegreif zu erzeugen.
Arduino C/C++ macht dies durch tone() ,
andere libs durch beep(),
und so was wäre doch auch als Ton-Signal für den Pi schön, ausgegeben auf seine Kopfhörerausgänge (nicht über GPIOs).
Wer will, könnte dann sogar damit tatütata oder amerikanisch wuiwuiwuwiwui oder Hänschenklein damit ganz schnell mal eben programmieren.
Für frequency gibt es ja auch #defines mit festen Notentasten
(#define _A4_ 440.0,
#define _Dis6_ 1244.51 etc.).

Die Syntax, die man häufig liest ist in der Art
tone(frequency, duration)
tone(frequency, duration, loudness)
(die Pin-Angabe, die man für Arduino braucht, fällt hier ja weg)

Ebenfalls häufig liest man etwas in der Art wie
tone(frequency, duration, loudness, samplerate)

Vielfach wurde diese Frage überall schon mal gestellt, aber nie gab es wirklich eine erkennbare Lösung (höchstens vage Links auf Monsterlibs wie alsa).

Hat hier jemand trotzdem Kenntnis von so einer Lib, entweder bereits irgendwo gepostet oder für eigene Zwecke mal als Hilfsfunktion selber erstellt?

alexander_ro
09.10.2016, 21:47
Nur mal so als Idee zum suchen bei dem Komandozeilen Befehl der das löst:

apt-get install beep

Wenn Du Details der Implementierung wissen willst den Sourcecode des Debian Pakets installieren und schauen wie die das machen.

Du kannst auch den beep Befehl in den Meisten Programmiersprachen einfach als Externes Programm aufrufen. Die Funktionen lauten oft exec oder system oder so ähnlich. Ich weiß ja nicht mit was Du Programmierst.

Alexander

hirnfrei
10.10.2016, 19:59
Mit ein Problem, welches zum Fehlen von Libs führt, ist die Faulheit der Entwickler. Ich habe auch schon für viele Dinge eigene Parser geschrieben, die schlummern aber auf meiner Platte, da ich keine Lust habe das ganze Zeug allgemeinverständlich zu formatieren und zu dokumentieren. Zumal ja auch viele Entwickler sowieso gerne ihr eigenes Süppchen kochen. Es ist also durchaus denkbar, dass irgendjemand einen Parser für solche Sounds geschrieben hat und benutzt, diese aber aus Faulheit nicht weiter gibt.

Da bliebe für dich nun die Frage, kannst du Funktionen schreiben, welche das gewünschte Ergebnis liefern? Wenn ja, würdest du den Aufwand betreiben es allgemeinverständlich zu formatieren, zu dokumentieren und zu veröffentlichen? In dem Fall wäre der Missstand einer fehlenden Lib in diesem Fall beseitigt.

HaWe
10.10.2016, 21:05
ich selber habe es immer gemacht, weil ich OpenSource und Public Domain für eine gute und unterstützenswerte Sache halte - sowohl für Lego NXC als auch Arduino als auch ein ganz wenig für den Pi, der selber noch Neuland für mich ist.
beep() habe ich heute Nachmittag ausprobiert, funktioniert aber nicht (kein "PC Lautsprecher" am Pi, der normale Audio-Jack wird wohl nicht erkannt),
Speaker test ebenfalls probiert, das funktioniert immerhin, es gibt aber dafür keine kurzen Töne soweit ich es selber ausprobiert als auch im Web gelesen habe (2-4 sek. Minimum).
Ich selber kann aber keine Soundlibs schreiben, zuwenig Kenntnis über alsa und die ganzen Soundtreiber und die viel zu komplizierten Soundfunktionen. Könnte ich es, würde ich es selbstverständlich veröffentlichen, aber zur Zeit bin ich (wohl auf Jahre hinaus) noch auf fertige Libs angewiesen, die genau die Art von Wrappern für C/C++ zur Verfügung stellen, wie ich sie im TOP beschrieben habe.
Das gilt auch sicher für eine ganze Menge weiterer Libs, wie sie z.B. zu Hunderten aber z.B. bereits für den Arduino schon existieren. Diesen ganzen Ideen- und Code-Pool muss man jetzt auch für den Pi sammeln und zusammenstellen.

alexander_ro
10.10.2016, 22:06
Das wusste ich nicht das der beep nur mit dem alten PC-Speaker geht. Ich dachte auf neuerer Hardware würde das über den Treiber der Soundkarte realisiert. Sorry.

Eine neue LIB für die Soundkarte zu schreiben ist vermutlich nicht Sinnvoll. Die wird nicht wirklich kleiner werden als die anderen die es gibt. Da eine Soundkarte selbst keine Töne erzeugen kann. Wie es zum Beispiel der PC-Speaker macht. Du musst die Töne per Software berechnen und dann an die Soundkarte übergeben.

Was ich noch gefunden habe ist der aplay der kann verschiedene Audio Formate Spielen wie z.B. WAV. Das funktioniert auch habe ich dieses mal vorher ausprobiert. Der aplay musste bei mir nicht extra installiert werden. Dann müsstest Du unter den Formaten die der abspielen kann nur ein einfaches suchen und per Software den Ton oder die Töne generieren und an aplay übergeben. Das sollte funktionieren.

Die Software des PI und der Arduinos kann man nicht wirklich vergleichen die Hardware des PI ist um größen Ordnungen höher als die der Arduinos ebenso das Betriebsystem das es bei Arduinos überhaupt nicht gibt. Daher sind Lösungen nicht immer mit einigen KB größen Libs zu bekommen Leisten aber auch sehr viel mehr. Dafür hat der PI ja auch mehr an Speicher und Rechenleistung zu bieten. Wenn Dir die Soundkarte zu komplex ist kannst Du aber mit einem kleine Verstärker einen Lautsprecher an einen PWM Pin des PI anschließen und dann mit diesem Töne erzeugen. Das macht der PC-Speaker so ähnlich.

HaWe
11.10.2016, 09:11
Alexander, was eine "Soundkarte" angeht, hast du meinen Post missverstanden.
Der Raspi hat keinen PC Speaker, daher funktioniert beep() auch nicht (sondern anscheinend nur auf Linux-PCs, die einen eingebauten Systemlautsprecher besitzen).
Wenn du aber zeigen kannst, wie man beep auf einem Standard-Raspi zur Tonausgabe über Audiojack bzw. HDMI bringen kann, dann zeige es einfach - bisher konnte ich kenen entsprechenden Hinweis im web finden.
Also nochmal:
Die Ausgabe soll auf Kopfhörer bzw standard-Ausgabe-Device (d.h. je nach Einstellung eben auch HDMI) erfolgen, genau wie die Ausgabe von z.B. omxplayer oder aller anderen Sounds, die der Raspi standardmäßig wiedergibt (vom wav file bis zum youtube Video).
Die Ton- Ausgabe soll durch Aufruf der Funktion innerhalb eines C/C++ Programms erfolgen können, am besten durch eine dar eingebundene C/C++ lib oder c+p des kompletten dafür nötigen Sourcecodes oder notfalls auch einen system call.
Die Syntax soll in etwa sein, wie ich es oben im TOP beschrieben habe, also ähnlich wie

tone(frequency, duration)
tone(frequency, duration, loudness)

alexander_ro
11.10.2016, 11:03
Es gibt auch PC ohne den klassischen PC-Lautsprecher und der beep geht aber trotzdem. Mir war nicht bekannt das das nicht bei allen ohne den PC-Lautsprecher so ist weil es zufällig bei meinen so geht.

Die von Dir angegebene Funktion wird so nie eine MP3 Datei oder ähnliches spielen können. Die Sounddateien sind Digitalisierte Spannungsverläufe und keine Noten. Ein kleiner aber wichtiger Unterschied.

Da der Raspi mit dem aplay oder dem von Dir genannten omx Sounddateien spielen kann muss die Lib die Du suchst bereits auf dem System vorhanden sein. Ich verstehe jetzt nicht warum Du nicht einfach mal den Sourcecode der Programme anschaust wie die das machen. Es gibt für Linux hunderte an offenen Programmen die Töne nach allen Arten machen man muss halt bereit sein auch mal irgendwo rein zu schauen. Wenn einem das zu viel Arbeit ist besteht halt noch die Möglichkeit mit dem exec einen externen Player zu bemühen damit der das Spielen übernimmt. Dabei muss man halt per Software die gewünschten Töne errechnen im einfachsten Fall mit der Sinusfunktion. Das ist auch nicht die schlechteste Lösung weil Du in Deinem Programm dann auch diese Funktion nicht pflegen musst. Nebenbei ein recht gängiger Weg in der gesamten UNIX/Linux Welt.

HaWe
11.10.2016, 11:13
wenn du weißt wie es mit beep() geht, dann zeig es, und es geht nicht um mp3 Daten oder wav files sondern um ad-hoc-Erzeugung von Tönen.
Theoretische Erklärungen helfen hier aber nicht zur Beantwortung der TOP-Frage, sondern nur eine Funktion oder Lib, die das definitiv leistet.
Wenn du also so etwas entsprechendes als Sourcecode kennst, gut, dann zeige sie auch und poste sie hier,
wenn nicht, hilft es nicht weiter.

alexander_ro
11.10.2016, 12:46
Nein ich weiß nicht warum das auf manchen geht und anderen nicht. Ich habe das heute bei einem Kunden probiert da ging es auch nicht. Vermutlich haben einige Treiberentwickler den Syscall auf die Soundkarte um gebogen und andere ignorieren den einfach.

Suchmaschine spukte noch das aus: http://raspberrypi.stackexchange.com/questions/8927/enabling-audible-terminal-bell-beep-on-wheezy
Ich habe es nicht probiert soll aber gehen laut den Texten.

Ich wundere mich nur wenn Du C/C++ Programme schreibst warum Du nicht mal bei Programmen die tun was Du möchtest in den Sourcecode schaust was die verwenden. Sehr hilfreich und auch lehrreich was ander tun. Töne kannst Du auch adhoc auch über einen Player adhoc erzeugen.

HaWe
11.10.2016, 12:56
wenn du glaubst, dass es geht mit beep auf Raspi, dann probiers aus - und poste das Ergebnis. Nach meinen Versuchen und Recherchen tut es das nicht.
Wenn du Programme findest, die das tun, was ich suche, poste den genauen Sourcecode bitte, ich finde keine,
und wenn du weißt, wie man "Töne auch adhoc auch über einen Player adhoc erzeugen" kann, dann poste es bitte ebenfalls - es muss allerdings über ein C/C++ Programm zur Ausführung gebracht werden.

Wie ich schrieb: Allgemeines Gerede bringt nichts, poste eine Lösung, alles andere ist nicht zielführend.

PS, Anm.: auf meinem Raspi läuft Debian Jessie 8, 4.4.13-v7+ falls das eventuell irgendwie wichtig sein könnte)

hirnfrei
11.10.2016, 15:14
Hast du PulseAudio installiert?

alexander_ro
11.10.2016, 16:08
Na ja, ich werde jetzt nicht Deine Entwicklungsarbeit machen ...
Ich wollte Dir zeigen wo Du findest was Du suchst. Sehe es jetzt aber nicht wirklich als meine Aufgabe an Schlüsselfertigen und getesteten Sourcecode anzubieten. Es ist schon interessant jeder will zwar Forderungen an die OpenSource Entwickler stellen aber selbst mal aktiv werden will eher keiner ... :-(

... und nein es geht auf meinem Raspi auch nicht wie ich schon oben geschrieben hatte wusste ich das nicht das es nicht geht und habe mich auch Entschuldigt wegen der falschen Information war keine Absicht.

HaWe
11.10.2016, 16:29
Alexander, halt die Füße still. Ich habe dich nicht gebeten, Entwicklungsarbeit für mich zu leisten, die Frage im TOP war, wer bereits etwas kennt.

hirnfrei,
ich bin mir ncht sicher, ich habe probeweise schon relativ viele Dinge installiert, aber beim Raspi finde ich keine Übersicht wie bei Windows Systemsteuerung->Programme und Funktionen, wo ich installierte Programme aufgelistet bekomme.
Wie kann ich es nachprüfen und ggf nachinstallieren?
Wie geht es dann weiter?

alexander_ro
11.10.2016, 16:37
Hm das klingt für mich nun anders. Gut wenn ich was finde aber selbst das müsste ich dann ja erst für Dich Testen um den genauen Sourcecode zu Posten. Ich habe Hinweise auf Quellen geliefert aber den Rest musst Du schon selber machen.

poste den genauen Sourcecode bitte

Probier mal dpkg -l | less für die Pakete die Du installiert hast.

HaWe
11.10.2016, 16:50
dankeschön für den Tipp!
pulseaudio 5.0-13 ist gelistet.

@hirnfrei:
und wie jetzt weiter?

hirnfrei
11.10.2016, 17:12
du solltest mit



pavucontrol


Das Kontrollprogramm starten können. Unter Wiedergabe werden all Programme aufgelistet, welche gerade Töne von sich geben. Wenn dein Programm dabei ist, vielleicht kannst du beep() in einer Schleife laufen lassen, kannst du es an alle möglichen Ausgabequellen leiten. Vielleicht gibt es dann einen Ton von sich.

HaWe
11.10.2016, 17:17
pavucontrol
Kommando nicht gefunden

hirnfrei
11.10.2016, 17:30
Seltsam. Bei meinem Raspi war es nach der Installation sofort vorhanden. Installiere PulseAudio mal neu



sudo apt-get install pulseaudio

HaWe
11.10.2016, 17:55
sudo apt-get install pulseaudio
0 aktualisiert, 0 neu installiert, 0 zu entfernen.

pavucontrol
Kommando nicht gefunden

hast du dich vertippt bei pavucontrol ?

- - - Aktualisiert - - -

ps
versuch doch mal bitte erst, das beep bei dir auf Kopfhörer zum Laufen zu kriegen (in raspi-config als standard audio-out definieren, wegen deiner USB Soundkarte, oder nimm die vorher raus und stell auf "auto")
und wenns funktioniert bei dir, sag bitte mal Bescheid.

alexander_ro
11.10.2016, 20:21
Pulse Audio Volume Control ist bei Debian ein eigenes Paket

apt-cache search pavucontrol zeigt das Paket an.

HaWe
12.10.2016, 16:07
@hirnfrei: hast du bei dir das beep() auf Kopfhörer-Jack zum Laufen gekriegt?

hirnfrei
12.10.2016, 16:26
Noch nicht einmal versucht. Bin Zeitlich ziemlich eingespannt im Moment.

HaWe
06.11.2016, 10:41
Da ich damit immer noch scheitere:
hat denn inzwischen jemand ein Beep(f,d) oder Tone(f,d) aus einem C/C++ Programm heraus zustande gebracht?