Denken Sie aus rechnerischer Sicht darüber nach.
Voice ist Ihre integrierte Standardausgabe, die von Grund auf auf Energieeffizienz und Effizienz des Befehlszyklus im Betriebssystem und in der Hardware optimiert wurde.
Erwägen Sie nun, Musik auf einem Instrument zu replizieren. Ein Instrument ist externe Hardware, die im Betriebssystem oder auf der Hardware, auf der es ausgeführt wird, nie optimiert wurde. In der Computerwelt umfasst die Verwendung neuer Peripheriegeräte entweder das Laden von Treibern (Plug-Ins auf Betriebssystemebene) oder die Verwendung eines Programms, das mit den Peripheriegeräten geliefert wird (Schnittstelle auf Anwendungsebene).
Personen mit perfekter Tonhöhe können dies im Vergleich zu effizienten Treibern auf Betriebssystemebene für das neue Peripheriegerät (Instrument). Gut, wenn auch langsamer als die Optimierung der Hardware.
Alle anderen (ohne perfekte Tonhöhe) können mit der Verwendung einer Schnittstelle auf Anwendungsebene (spezifisches Programm) zur Steuerung des Peripheriegeräts (Instruments) verglichen werden. Langsame und schlechteste Leistung im Vergleich zu Treibern auf Betriebssystemebene oder Hardwareoptimierung.
Betrachten Sie alternativ eine datenorientierte Perspektive.
Die Audioeingabe ist grundsätzlich analog und wird zu Diskussionszwecken davon ausgegangen, dass die Gehirn speichert Audioeingang in einem einfachen analogen Format (ähnlich einer WAV-Datei auf dem Computer). Die Sprachausgabe akzeptiert nativ dasselbe analoge Format, was bedeutet, dass das Wiedergeben des gerade Gehörten fast keinen Verarbeitungsaufwand verursacht.
Stellen Sie sich Noten als digitales (logisches) Format vor - eine Folge von Notenanfangs- / Endmarkierungen . Um ein Instrument zu spielen, müssen Sie den folgenden Algorithmus durchlaufen. Nehmen Sie der Einfachheit halber an, dass Sie jeweils nur 1 Instrument spielen.
Instrument D = getCurrentInstrument (). Open () P = NoteInputStream (AnalogAudioInputStream (Eingabesong), D) während wahr: notiere N = P.nextNoteMarker () wenn N == null, dann beende sonst wenn N.isBegin dann D.holdNoteAfterDelay (N, N.delay) sonst wenn N.isEnd dann D.releaseNoteAfterDelay (N, N.delay)
Scheint im Pseudocode einfach genug. Aber was ist wirklich los? Die Komplexität liegt in den obigen API-Funktionen.
getCurrentInstrument () ist eine Funktion, die einen Verweis auf das Instrument in Ihren Händen zurückgibt. Relativ einfach. Die instrument.open () -Funktion ist eine ganz andere Sache. Dadurch werden die Treiber für das Instrument geladen - mit anderen Worten, Sie müssen sich daran erinnern, wie das Instrument gespielt wird. Dies beinhaltet das mentale Zuordnen logischer Notizen zu allem, was Sie auf dem Instrument tun müssen, um die Note zu erzeugen (wahrscheinlich eine Reverse-Lookup-Tabelle). Wenn das Instrument das gleichzeitige Halten und Loslassen vieler Noten umfasst (wie bei einem Klavier), müssen Sie auch herausfinden, wie Sie die Finger für das Halten einer Reihe von Noten optimieren können. Daher benötigt instrument.open () viel Rechenleistung und Kurzzeitspeicher (RAM).
AnalogAudioInputStream (audioInput) verwendet analoge Audioeingänge und konvertiert sie in einen "Datenstrom".
NoteInputStream (analogInput, Instrument) verwendet den oben genannten analogen Audiostream und ein Instrument und extrahiert die Noten für das angegebene Instrument aus dem analogen Eingang. In diesem Schritt kommt die perfekte Tonhöhe ins Spiel, bei der das "Haupt" -Instrument identifiziert und seine Frequenz in Echtzeit logischen Noten zugeordnet wird.
Jede Note wird vor der Verarbeitung als Tonart, Oktave, Verzögerung und Beginn dargestellt / end-Flag, das angibt, ob die Note ein Hold-Down- oder Stop-Hold-Down-Ereignis darstellt.
Wiedergabe des Analogeingangs über das Instrument: Durchlaufen Sie den Satz der extrahierten Knoten und halten / lassen Sie das Instrument los wie diktiert. Die Komplexität der Vorgänge zum Halten / Freigeben von Noten hängt stark vom Instrument ab und kann offensichtlich fehlschlagen, wenn Ihnen die Finger ausgehen oder die Eingabe lächerlich ist.