Brauch ich nun eine Synthesizer-library oder wie?

Hallo.

Ich würde gerne in C/Linux ein Programm schreiben.Diesem will ich (über den D-Bus z.B.) kontinuierlich Text-Daten liefern.
Sagen wir alle 5-10 ms.
Als Output hätte ich gerne entweder ein mp3stream, (den man über Internet empfangen kann,)
oder ein Stream auf meine Sounkarte. (Dann könnte ich über shoutcast den stream erzeugen)

Ihr fragt euch jetzt bestimmt, wie ich Text-Daten in mp3/Sound verwandeln möchte. Als erste Idee würde ich gerne das midi-format benutzen.

Jetzt habe ich schon etwas recherschiert. Es gibt hier im Internet tausende von kleinen Programmen und libraries, die irgendwie in meine Richtung gehen, aber keines so wirklich. So langsam habe ich den Überblick verloren. Da ich persönlich noch nie etwas für MIDI, Sound und Streaming programmiert habe, würde ich gerne Euch fragen, was Ihr für Tips habt.

Wie ich es verstanden habe, brauche ich erst einen code, der die daten in ein midi-konstrukt verwandelt.
Dann muss aus dem midi-konstrukt eine sound-buffer erstellt werden. Das nennt man dann Synthesizer, oder?
Dann muss ich mich entscheiden, wie ich den sound an die soundkarte schicke oder wie ich den sound weitergebe zu shoutcast, damit dieser die musik ins große weite internet streamen kann.
Damit kommt dann ALSA, JACK, usw. ins Spiel…

Ich freue mich auf Eure Anregungen, Lenny

Hallo Lenny25

Ich würde das ganze jedenfalls in Teilbereiche zerlegen, das ganze auf einmal wird unübersichtlich. Ich hatte mal SuSe 8, da waren schon Sound-Klassen in der Lib („usr/kde/include“ oder so). Die Hilfe riet an, einen „MIDI-Manager“ oder ähnlich zu verwenden.

Ich würde einzelne Klassen seperat schreiben:
1
Text auf MIDI-Noten umwandeln, die über irgendeinen SW-Synth abspielen (der diese auf Audio-Signal umwandelt).
2
AudioIn vom Synthy als Stream abzuschicken.
3
usw.

Wenn die einzelnen Klassen dann fertig sind baust du dir draus ein Monster-Projekt, :smile:

Ihr fragt euch jetzt bestimmt, wie ich Text-Daten in mp3/Sound
verwandeln möchte. Als erste Idee würde ich gerne das
midi-format benutzen.

Text auf MIDI-Noten ist keine Sache, wenn man das Datenformat kennt:
http://de.wikipedia.org/wiki/Musical_Instrument_Digi…
oder hier:
http://www.harmony-central.com/MIDI/Doc/table1.html
oder hier:
http://www.google.at/search?q=status+byte&ie=utf-8&o…

Fest steht (weil MIDI-Norm):
du brauchst für MIDI-Nachrichten ein Statusbyte und ein bis zwei Datenbytes. Für den Anfang genügen NoteOn, wenn die Note beginnen soll und NoteOff, wenn sie aufhören soll.

NoteOn

 byte status = 144;
 byte data1 = der ASCII, der rein kommt;
 byte data2 = Velocity (Anschlag), am besten so 80 konstant;

NoteOff

 byte status = 128;
 byte data1 = der ASCII, der rein kommt;
 byte data2 = Release-Velocity, nicht so wichtig;

Das wäre für Kanal Null. Für weitere Kanaele 0…15 jeweils auf das Statusbyte aufaddieren.
Von Streams verstehe ich nicht viel, da findet sich vielleicht jemand anders hier am Brett. Du brauchst aber bloss die Schnittstelle (Code) bei shoutcast, ALSA oder JACK anzugucken, mit der man MIDI-Noten abschickt. Das geht dann auch live über die Tastatur (!).
Du musst Dich halt nur entscheiden, was es dann letzlich werden soll, Audio-Stream oder eben MIDI.

lG
Martin B

Hi Martin.

Ich würde einzelne Klassen seperat schreiben:
1
Text auf MIDI-Noten umwandeln, die über irgendeinen SW-Synth
abspielen (der diese auf Audio-Signal umwandelt).

Ja, das ist eine gute Idee mit separat schreiben.
Durch die Definitionen wird der erste Teil schnell gemacht sein.

2
AudioIn vom Synthy als Stream abzuschicken.

Das ist gerade mein Problem. Ich brauche eine Schnittstelle. Ich habe im Laufe des Tages zwei Möglichkeiten gefunden. Entweder ich benutze die DSSI Schnittstelle, um dem Program Rosegarden die Midi-Inforamtion zu senden.
Oder ich benutze Timidity und schicke diesem Program über einen Midi-Port die Daten.

Rosegarden ist etwas überdimensioniert und benutzt JACK, was wiederum eine Midi-Soundkarte verlangt, wie ich das verstanden habe. Allerdings gibt es ein kleines DSSI-Tool, mit denen man einzelne Noten Senden könnte. Dann könnte ich über ein Script die Daten darüber versenden.

Timidity hab ich schon dazu bringen können, ne midi-Datei abzuspielen, allerdings hat dieses keine DSSI-Schnittstelle. Wie ich diesem Program einen Midi-Strom senden kann, ist mir noch nicht klar. Allerdings ist dieses Programm viel kleiner und macht einen besseren Eindruck auf mich.

NoteOn

byte status = 144;
byte data1 = der ASCII, der rein kommt;
byte data2 = Velocity (Anschlag), am besten so 80 konstant;

NoteOff

byte status = 128;
byte data1 = der ASCII, der rein kommt;
byte data2 = Release-Velocity, nicht so wichtig;

Das wäre für Kanal Null. Für weitere Kanaele 0…15 jeweils
auf das Statusbyte aufaddieren.

Das heißt, ich sende pro Kanal 3 Bytes, um ein Ton zu verändern.
Ich habe 16 Kanäle zur verfügung und muss somit pro 5-10 ms max. 48 Bytes senden.

Was ich noch nicht gefunden habe, ist die Definition der Schnittstellen, um diese selber zu schreiben. Ist das D-Bus, UDP, oder wie?

Von Streams verstehe ich nicht viel, da findet sich vielleicht
jemand anders hier am Brett. Du brauchst aber bloss die
Schnittstelle (Code) bei shoutcast, ALSA oder JACK anzugucken,
mit der man MIDI-Noten abschickt. Das geht dann auch live über
die Tastatur (!).

Du schreibst, um die Schnittstelle zu schreiben, sollte ich den Code durchchecken. Vielleicht ist das die beste Lösung.

Ich glaube, für den Anfang reicht mir das Abpsielen des Sounds und gleichzeitiges Aufnehmen desgleichen, um es dann mit Shoutcast zu versenden. Ich hoffe, daß die Geschwindigkeit meines Rechners das auch mitmacht. :wink:

Du musst Dich halt nur entscheiden, was es dann letzlich
werden soll, Audio-Stream oder eben MIDI.

Ja, stimmt eigentlich. Midi kann man ja eigentlich auch Streamen, oder? Dann könnte ich mir doch den ganzen ShoutCast-Block komplett sparen, oder?

Danke für die ersten Anregungen, viele Grüße, Lenny

Hi Lenny

AudioIn vom Synthy als Stream abzuschicken.

Das ist gerade mein Problem. Ich brauche eine Schnittstelle.

Wie ich diesem Program einen Midi-Strom senden kann, ist mir
noch nicht klar.

Wie schickt man irgendwelche Daten an irgendein Linux-Programm?
Da kann ich dir als Win32-Benutzer nichts dazu sagen.
Da hilft es vielleicht, auf den „Man-Pages“ zu gucken.

Das heißt, ich sende pro Kanal 3 Bytes, um ein Ton zu
verändern.

MIDI-Kabel haben eine Baudrate von 32000 kbits, als maximal 3200 Bytes/Sekunde, Start- und Stop-Bits eingerechnet. Im Speicher gibt es m.E. keine Beschränkung, aber soviel wirst Du nicht brauchen.
Um genau zu sein: du brauchst je 3 für NoteOn und für NoteOff, nicht pro Kanal. Wenn du auf Kanal 6 z.B. einen Akkord mit 10 Noten spielen willst, sind das 10 * 3 Bytes für NoteOn, wie auch für NoteOff, also 60 zusammen.

Ich habe 16 Kanäle zur verfügung und muss somit pro 5-10 ms
max. 48 Bytes senden.

Wenn du nur eine Note je Kanal senden möchtest, dann ja. Das sind dann aber nochmal 48 für NoteOff.
Wie oft Du die schickst (alle 5-10 ms oder wie immer), bleibt Dir überlassen.

Du schreibst, um die Schnittstelle zu schreiben, sollte ich
den Code durchchecken. Vielleicht ist das die beste Lösung.

Code lesen ist *immer gut*. Ich meinte das so, daß Du in einer vorhandenen Klasse schon fertige Schnittstellen vorfinden kannst.

Du musst Dich halt nur entscheiden, was es dann letzlich
werden soll, Audio-Stream oder eben MIDI.

Ja, stimmt eigentlich. Midi kann man ja eigentlich auch
Streamen, oder?

Kann man: die Musiker in den Studios haben vor 10 Jahren schon MIDI-Live-Sessions über das Netz gemacht.

Dann könnte ich mir doch den ganzen
ShoutCast-Block komplett sparen, oder?

Kommt darauf an, was du vor hast.

lG
Martin B