MIDI-Noten aus Mikrofonsignalen absaugen.

mixer, effekte (ladspa und vst), metronome, notensatz, stimmgeräte und was sonst noch an audio-programmen bleibt...
Antworten
zettberlin
Power User
Power User
Beiträge: 1233
Registriert: Di Jul 06, 2004 11:47 pm
Wohnort: Berlin
Kontaktdaten:

MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von zettberlin »

Hallo Leute,

kennt jemand von Euch ein System (Plugin, Standalone, Lib egal), mit dem man aus beliebigen vom Mikrofon aufgenommenen Signalen MIDI-Noten machen kann.

Das sollte in Echtzeit gehen und die Noten sollten konfigurierbar sein.

Und wozu?

Ich hätte gern ein einfaches Drumpad. Dazu kann ich jederzeit zum Beispiel ein Buch mit einem Mikrofon verbinden und mit Drumsticks draufhauen. Dabei entstehen Signale, die sich so deutlich unterscheiden, dass sie eine Software ohne weiteres einzeln behandeln könnte.

Die Software müsste nun noch folgenden Trick draufhaben:

Code: Alles auswählen

if ($soundmuster01)
   midinote_spawn(F#,velocity,optionsF#)
 elseif ($soundmuster02)
   midinote_spawn(G,velocity,optionsG)
 else
  silence
und so weiter.
Ich habe vor 3 Jahren in Chemnitz ein etwa 15jähriges Wunderkind getroffen, das hatte auf diese Weise aus seinem Laptop ein Drumkit gemacht. Das war allerdings für diesen Laptop in langer Kleinarbeit optimierte Software, die sich nur im Quellcode einstellen ließ.

Hat jemand von Euch eine Idee, wo man da anfangen könnte?
nostrum fungitur
brummer
Power User
Power User
Beiträge: 355
Registriert: Mi Jul 16, 2008 10:46 am

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von brummer »

zettberlin hat geschrieben:Hat jemand von Euch eine Idee, wo man da anfangen könnte?
Hast du schon ma mit dem guitarix midi out experimentiert? :wink:
Einfach fx-out abklemmen und nen micro an system-capture.
midi out auf kanal 9 und mit qsyth verbinden

man könnte da die noten abfrage und ausgabe natürlich noch ein bisschen vereinfachen, wenn du es nur auf 2 3 4 noten abgesehen hast. :wink:
zettberlin
Power User
Power User
Beiträge: 1233
Registriert: Di Jul 06, 2004 11:47 pm
Wohnort: Berlin
Kontaktdaten:

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von zettberlin »

brummer hat geschrieben:
zettberlin hat geschrieben:Hat jemand von Euch eine Idee, wo man da anfangen könnte?
Hast du schon ma mit dem guitarix midi out experimentiert?
Ja, habe ich natürlich ;-)

Ich hatte aber zwei Probleme:

1.) welche Note am Ende rauskommt, ist bei Perkussionssignalen noch unsicherer als bei Gitarrennoten.
2.) das Modul erzeugt eine Art "Grundrauschen", aus dem immer wieder MIDI-Noten rausgehen, ohne dass man überhaupt was gespielt hat.

Allerdings glaube ich, dass man auf Basis der Notenerkennung von Guitarix schon was machen könnte.

Man müsste sowas wie Bereiche einstellen können. Etwa in der Art: wenn die eingehende Note als tiefer als C erkannt wird, sende MIDI-C, wenn sie höher als C aber tiefer als E ist, sende F und so weiter. Dabei sollte man wohl ein Filter vorschalten, das möglichst nur einen Grundton übrig lässt, damit Sprünge durch Oktaven ausgeschlossen sind.

Am besten wäre freilich eine echte Mustererkennung, die sich nicht unbedingt nur auf Standard-Noten bezieht sondern auch auf Timbre, eventuell auuch Stereo-Balance etc.

Man braucht im Prinzip nur 8-10 verschiedene Geräusche, die sicher erkannt werden.
nostrum fungitur
brummer
Power User
Power User
Beiträge: 355
Registriert: Mi Jul 16, 2008 10:46 am

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von brummer »

Da kann ma was machen, im momet erkennt das modul 127 noten, wenn das auf 8-10 beschränkt wird, erhalten wir schon eine ansehnliche Treffsicherheit.
Das grundrauschen kann man rausfiltern.

du findest in gx_midi_engine.cpp line 231 folgendes:

if (( noten >= 0)&&(noten <= 127)) {

diese zeile grenzt den notenbereich ein, der erfasst wird.
(noten enthält die aktuel eingelesene note die als midi signal rausgegeben wird.
wenn du nun dadrunter noch sowas wie

if(noten >0 && noten < 10) noten = 5;
else if(noten >9 && noten < 20) noten = 15;
else if(noten >19 && noten < 30) noten = 25;
usw. einfügst, erweiterst du den bereich für den die selbe note ausgegeben wird.

um den Einfluss des Hintergrundrauschens einzudämmen kannst du in line 150

audio_db = BeatFilter2*10;

die 10 verkleinern, 8, . . 6, . .4, . . . bis es passt.
(der beatfilter ist ein Lowpassfilter) :wink:
zettberlin
Power User
Power User
Beiträge: 1233
Registriert: Di Jul 06, 2004 11:47 pm
Wohnort: Berlin
Kontaktdaten:

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von zettberlin »

brummer hat geschrieben:Da kann ma was machen, im momet erkennt das modul 127 noten, wenn das auf 8-10 beschränkt wird, erhalten wir schon eine ansehnliche Treffsicherheit.
Das grundrauschen kann man rausfiltern.

du findest in gx_midi_engine.cpp line 231 folgendes:
...
Genial! Du bist mein Held des Tages!

Damit habe ich jetzt erst mal eine einzelne Trommel sehr zuverlässig hinbekommen.

if(noten >0 && noten < 10) noten = 5;
else if(noten >9 && noten < 50) noten = 15;
else if(noten >49 && noten < 100) noten = 25;
else if(noten >99 ) noten = 55;

Allerdings bekomme ich es (noch) nicht hin, auch nur eine zweite Note zuverlässig von einem anderen Schlag triggern zu lassen. Egal, ob ich mit einem Drumstick auf das Mikrostativ haue oder mit dem Mittelfinger auf die Tischplatte oder ein Buch auf dem Tisch(das Mikro hängt darüber) -- in 90% bekomme ich 15, es ist mir nicht möglich, 3-4 mal hintereinander oder auch nur sicher einmal 25 zu bekommen. 55 bekomme ich gar nicht.

Einigermaßen seltsam: mit der Gitarre geht es gar nicht, da kommen nur erratisch meist 15. Lässt sich die Präzision der ersten Notenerkennung auch noch herunterschrauben?

Und am besten wäre eben eine nicht auf Noten bezogene Mustererkennung.

So was in der Art einer Mustererkennung wie für eine Noise-Reduktion. Im Endeffekt Statistik:

Nimm die ersten 3 Millisekunden des eingehenden Impulses. Finde charakteristische Eigenschaften. Dann spiele immer Note 15, wenn ein Impuls kommt, der eine (einstellbar) ähnliche Charakteristik hat. So könnte man auch unter 10ms Latenz bleiben. Vorrausgesetzt, die ersten 3ms der Signale unterscheiden sich ausreichend, könnte man eine ganze Schießbude haben.
Ein Mensch kann auch mit 2 Promille noch unterscheiden, ob ich auf die Tischkante oder das Buch haue. Ob er/sie das tatsächlich an den ersten 3ms erkennen kann, weiß ich allerdings auch nicht.

MDA-Beatbox bietet so eine unpräzise, nur auf den Impuls bezogene Reaktion. Allerdings gibt es eben nur Sound und keine MIDI-Noten aus und wann was wie getriggert wird, erschließt sich mir da auch nicht.

Und wenn nun Guitarix einen einschaltbaren Modus hätte, in dem man solche Tricks veranstalten könnte? Sozusagen ein MIDI-Trigger-Preset, könnte zum Beispiel "AnyTrix" heißen ;-)
nostrum fungitur
brummer
Power User
Power User
Beiträge: 355
Registriert: Mi Jul 16, 2008 10:46 am

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von brummer »

zettberlin hat geschrieben:Einigermaßen seltsam: mit der Gitarre geht es gar nicht, da kommen nur erratisch meist 15. Lässt sich die Präzision der ersten Notenerkennung auch noch herunterschrauben?
sicher dat, hier ist ma ein link damit du siehst was die noten Nummern bedeuten:

http://www.midimountain.com/midi/midi_note_numbers.html
zettberlin
Power User
Power User
Beiträge: 1233
Registriert: Di Jul 06, 2004 11:47 pm
Wohnort: Berlin
Kontaktdaten:

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von zettberlin »

brummer hat geschrieben:
zettberlin hat geschrieben:Einigermaßen seltsam: mit der Gitarre geht es gar nicht, da kommen nur erratisch meist 15. Lässt sich die Präzision der ersten Notenerkennung auch noch herunterschrauben?
sicher dat, hier ist ma ein link damit du siehst was die noten Nummern bedeuten:

http://www.midimountain.com/midi/midi_note_numbers.html
Ok, das ist interessant aber das meinte ich nicht.

Ich meinte das Modul, das die dominierende Frequenz im Eingangssignal erkennt. Wenn ich es richtig verstehe, analysiert es den Eingang und entscheidet dann: es ist E. Oder es ist C' etc. Es sollte aber auch sagen können: "Das ist irgendwas zwischen E und G. Und das hier klingt so ähnlich wie das E bis G von vorhin, obwohl es stärker zum E tendiert und auch im Obertonbereich ein bisschen anders ist." Und ideal wäre es, wenn man sagen könnte: "Pass auf Kollege: das hier hätte ich immer gerne als 15 interpretiert. Du erkennst es daran, dass seine dominierende Frequenz zwischen A und C liegt und dass es starke Anteile genau dieser Sorte von rosa Rauschen hat."

Gibt es da irgendwo eine Stelle, an der man an sowas herumbasteln könnte ;-) hechel, hechel, waff wafff :-)
nostrum fungitur
brummer
Power User
Power User
Beiträge: 355
Registriert: Mi Jul 16, 2008 10:46 am

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von brummer »

puh, ne das wohl eher nicht.

Aber, du könntest auch ma an den treshold settings des pichtrackers schrauben,
gx_pitch_tracker.cpp line 39 und 42.

// Value of the threshold above which
// the processing is activated.
const float SIGNAL_THRESHOLD_ON = 0.001;
// Value of the threshold below which
// the input audio signal is deactivated.
const float SIGNAL_THRESHOLD_OFF = 0.0009;

wenn du die werte höher setzt, springt der tuner später an, und liest dementsprechend "nur die spitzen", damit sollte sich noch was machen lassen, wenn du mit stöckern auf Bücher einprügelst. :popc:
zettberlin
Power User
Power User
Beiträge: 1233
Registriert: Di Jul 06, 2004 11:47 pm
Wohnort: Berlin
Kontaktdaten:

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von zettberlin »

brummer hat geschrieben:puh, ne das wohl eher nicht.

Aber, du könntest auch ma an den treshold settings des pichtrackers schrauben,
gx_pitch_tracker.cpp line 39 und 42.

// Value of the threshold above which
// the processing is activated.
const float SIGNAL_THRESHOLD_ON = 0.001;
// Value of the threshold below which
// the input audio signal is deactivated.
const float SIGNAL_THRESHOLD_OFF = 0.0009;

wenn du die werte höher setzt, springt der tuner später an, und liest dementsprechend "nur die spitzen", damit sollte sich noch was machen lassen, wenn du mit stöckern auf Bücher einprügelst. :popc:
Das hat mich zwar etwas näher an das Verständnis des ganzen Vorgangs gebracht aber das Ergebnis ist immer noch das gleiche:

Code: Alles auswählen

68: b0 7 4c control change (channel 0): controller 7, value 76
68: e0 0 40 
68: 90 63 7f note on (channel 0): pitch 99, velocity 127
68: e0 0 0 
221: b0 7b 7f control change (channel 0): controller 123, value 127

pitch_tracker: 39

Code: Alles auswählen

const float SIGNAL_THRESHOLD_ON = 0.02;
// Value of the threshold below which
// the input audio signal is deactivated.
const float SIGNAL_THRESHOLD_OFF = 0.009;
// Time between frequency estimates (in seconds)
const float TRACKER_PERIOD = 0.1;
// The size of the read buffer
const int FFT_SIZE = 2048;
oder:

Code: Alles auswählen

const float SIGNAL_THRESHOLD_ON = 0.02;
// Value of the threshold below which
// the input audio signal is deactivated.
const float SIGNAL_THRESHOLD_OFF = 0.008;
// Time between frequency estimates (in seconds)
const float TRACKER_PERIOD = 0.05;
// The size of the read buffer
const int FFT_SIZE = 1024;
Immer das gleiche, ich bekommen fast immer

Code: Alles auswählen

note on (channel 0): pitch 39, velocity 127
Das Einzige, was ich einigermaßen hinbekomme, ist dass es öfter mal die eine oder die andere Note gibt. Wann welche kommt, kann ich aber durch den Anschlag nicht beeinflussen. Ich haue auf die Tischplatte und der tracker erkennt eine Note zwischen 9 und 20 und wenn ich auf das Mikrostativ schlage, erkennt er das gleiche. Nur in etwa 25% der Anschläge hört das Ding etwas über 29 heraus. Bei diesen Settings:

Code: Alles auswählen

		  if(noten >0 && noten < 10) noten = 9;
		  else if(noten >9 && noten < 20) noten = 19;
		  else if(noten >19 && noten < 30) noten = 29;
		  else if(noten >29 ) noten = 51;
Ich glaube immer mehr, dass der Pitchtracker nicht für sowas gemacht ist....
nostrum fungitur
brummer
Power User
Power User
Beiträge: 355
Registriert: Mi Jul 16, 2008 10:46 am

Re: MIDI-Noten aus Mikrofonsignalen absaugen.

Beitrag von brummer »

Ja, wird wohl so sein.

Vieleicht wenn du etwas anders an die sache rangehst, zb. im tuner schauen welche note er anzeigt wenn du auf z.b. nen buch schlägst, die note sollt eigetlich immer so zwischen zwei bis vier noten liegen, diesen Bereich kannst du dann mit dem oben erwänten algoritmus festlegen (siehe midi noten tabele). (zur not kannst du gx_tuner zur hilfe nemen, der zeigt auch die jeweilige Oktave an). Auch wenn du auf die kante haust, wird es die selbe note geben. Allerdings, wenn du z.b. nen Aluwinkel über die kante legst, kommst du deutlich in einen anderen noten bereich.
Nun nimmst du dir noch nen stück plastic, nen früstücksbretchen, ne alte (oder auch ruhig ne halbvolle) bierbüchse, . . . und und , , , wiederholst die procedur. Hast du die notenbereiche festgelegt, hast du dein virtuelles trash schlagzeug :lol: und kannst lossspielen.

wenn das so für dich funktioiert, kann man das natürlich automatisieren (noten erkenug und ramenzuweisung) und ne nutzvolles Interface dafür machen (zugewiesener bereich -> ausgangsnote, etc. ), dann könnte man sich nen trash schlagzeug ma eben so zusammen stellen.

gruß
hermann
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste