"Bariton - Klavier - Morphing" mittels additiver Synthese

Thomas Musil
2000

Wissenschaftliches Projekt

 

Ressourcen:

J. Kalitzke: Nachricht von Charon

 

"Bariton - Klavier - Morphing" mittels additiver Synthese

Thomas Musil

Diese Beschreibung gliedert sich in folgende Abschnitte:

  1. Prinzip von Morphing mittels add. Synthese
  2. Hardware-Umgebung und Betriebs-System
  3. Vorbereitungen, Analysen
  4. Bedienungs-Anleitung von morph06.pat
  5. Timing
  6. Tables
  7. File-Struktur

 

------------------------------------------------------------------------


1. Prinzip von Morphing mittels add. Synthese

  • Primär-Ziel:
    Es gilt, einen kontinuierlichen Übergang zwischen 2 Klängen mit Partial-Ton-Struktur zu schaffen, wobei auf halbem Wege nicht die Summe beider Klänge, sondern ein neuer Zwischen-Klang zu hören ist.
  • Erweitertes Ziel:
    Der Morph soll zeit-verzerrt spielbar sein; man soll beliebig zwischen den beiden Klängen, bezüglich ihrer Grundfrequenz und ihrer Formant-Struktur, hin- und her-blenden können; die Grunfrequenzen beider Klänge sollen verstimmbar sein; ein eventuelles Vibrato eines Klanges soll regulierbar sein.
  • Voraussetzungen:
    Beide Klänge bestehen aus zeitlich langsam veränderlichen Partialton-Verläufen. (Die Modulations-Frequenzen von Partial-Frequenz und/oder Partial-Amplitude sollen kleiner 10 Hz sein.)
  • Realisierung:
    Da sich der Anfang eines Instrumental-Tones mittels add. Synthese nur mittelmäßig gut realisieren läßt, wird vom Original-Soundfile auf die add. Synthese übergeblendet. Der Kern des Morph-Synthesizers besteht aus einer Bank von 120 Oszillatoren. Jeder Oszillator ist zeitlich frei steuerbar bezüglich seiner Amplitude und seiner Frequenz, bzw. läßt sich in einen definierten Initial-Phasen-Zustand bringen. Die interpretierten Analyse-Daten eines Klanges bestehen aus einem Ensemble von je einem Partial-Amplituden-Vektor und einem Partial-Frequenz-Vektor pro Abtast-Periode (z.B. 10 ms). Die Vektorlänge beträgt z.B. 120 Teiltöne. Der Momentan-Zustand eines Klanges läßt sich zu jedem Zeitpunkt bestimmen, indem man die zeitlich benachbarten Freq.- und Ampl.-Vektoren linear interpoliert. Das Morphing von 2 Klängen funktioniert wie folgt:
    man bestimmt zu einem Zeitpunkt die interpolierten Freq.- und Ampl.-Vektoren von einem Klang A und einem Klang B, und liest aus 2 Tabellen den Freq.-Morph-Faktor bzw. den Ampl.-Morph-Faktor zu jenem Zeitpunkt, und gewichtet die Partial-Freq. von A mit dem F-M-Faktor, die Partial-Freq. von B mit (1 - F-M-Faktor), die Partial-Ampl. von A mit dem A-M-Faktor, die Partial-Ampl. von B mit (1 - A-M-Faktor), und addiert die Partial-Freq._Paare bzw. die Partial-Ampl.-Paare von A und B. Das Problem, dass die beiden Klänge A und B unterschiedlich lang sind, bzw. dass nur bestimmte Abschnitte der Klänge relevant sind, löst man insofern, indem man eine neue Gesamt-Morph-Länge bestimmt, und die Original-Daten der 2 Klänge mittels zweier Stauch/Dehn-Tabellen zeitlich verzerrt ausliest. Zusätzlich werden von beiden Klängen, in einem bestimmten Zeit-Ausschnitt, noch die Mittelwerte ihrer Partial-Ampl. und -Freq. berechnet. Damit kann man das Vibrato (Tremolo) eines Klanges zusätzlich verstärken, abschwächen oder sogar kreuz-modulieren. Mittels add. Synthese läßt sich auch noch ganz einfach die Tonhöhe transponieren, indem man die Partial-Freq. der Quell-Klänge mit einem Verstimmungs-Faktor multipliziert.

 

Die Amplitude, bzw. die Frequenz jedes einzelnen Oszillators wird zwischen 2 Abtast-Perioden (z.B. 10 ms) noch 441 mal linear interpoliert (SR = 44100 Hz).

Legende:

piPartial-Index (1 .... 120).
tiZeit-Index der Partial-Vektoren, alle 10 ms gesampelt (0 .... Endzeit/0.01 ms).
tbeliebige Zeit.
As[pi][ti]Amplitude des pi-ten Quell-Teiltons zur Zeit ti*0.01 ms.
Ad[pi][ti]Amplitude des pi-ten Ziel-Teiltons zur Zeit ti*0.01 ms.
As[pi][t]Amplitude des pi-ten Quell-Teiltons zur Zeit t.
Ad[pi][t]Amplitude des pi-ten Ziel-Teiltons zur Zeit t.
Am[pi][t]Amplitude des pi-ten Morph-Teiltons zur Zeit t.
Fs[pi][ti]Frequenz des pi-ten Quell-Teiltons zur Zeit ti*0.01 ms.
Fd[pi][ti]Frequenz des pi-ten Ziel-Teiltons zur Zeit ti*0.01 ms.
Fs[pi][t]Frequenz des pi-ten Quell-Teiltons zur Zeit t.
Fd[pi][t]Frequenz des pi-ten Ziel-Teiltons zur Zeit t.
Fm[pi][t]Frequenz des pi-ten Morph-Teiltons zur Zeit t.
Ma[t]Morph-Überblend-Zustand der Amplitude zur Zeit t.
Mf[t]Morph-Überblend-Zustand der Frequenz zur Zeit t.

 

Alle Amplituden-Berechnungen finden im logarithmisch transformierten Bereich statt (dB).

         As[pi][t] = As[pi][tn] + (t - tn) * (As[pi][tn+1] -
         As[pi][tn])      für     tn <= t/10 ms < (tn+1);
         Ad[pi][t] = Ad[pi][tn] + (t - tn) * (Ad[pi][tn+1] -
         Ad[pi][tn])    für     tn <= t/10 ms < (tn+1);
         Fs[pi][t] = Fs[pi][tn] + (t - tn) * (Fs[pi][tn+1] -
         Fs[pi][tn])         für     tn <= t/10 ms < (tn+1);
         Fd[pi][t] = Fd[pi][tn] + (t - tn) * (Fd[pi][tn+1] -
         Fd[pi][tn])       für     tn <= t/10 ms < (tn+1);


         Am[pi][t] = Ma[t] * As[pi][t] + (1 - Ma[t] * Ad[pi][t])
         Fm[pi][t] = Mf[t] * Fs[pi][t] + (1 - Mf[t] * Fd[pi][t])

 

------------------------------------------------------------------------

2.Hardware-Umgebung und Betriebs-System

         Fostex VC-8 Wandler einschalten;
         iem10 (linux-Rechner) starten;
         einloggen auf iem10;
         erste Unix-Shell öffnen;
         "rlogin pressl" 'return';
         "apanel" 'return';
             eventuell bei apanel noch ADAT-In und ADAT-Out
         anwählen;
         "top" 'return'.


         zweite Unix-Shell öffnen;
         "rlogin pressl" 'return';
         "tcsh" 'return';
         "maxmorph" 'return';   ( altes fts-Max 1.5.3 für SGI

         wird gestartet )


             den Class-Patch "libmorph_k.pat" verkleinern;
         "morph06.pat" öffnen.

------------------------------------------------------------------------

3.Vorbereitungen, Analysen

( siehe 7.File-Struktur )

 

------------------------------------------------------------------------

4.Bedienungs-Anleitung von morph06.pat


    a.)  wenn es schnell gehen soll:


        Wenn "morph06.pat" geöffnet ist:
        2x "start" klicken bei "system:" links oben;
        "out-gain"-Regler aufziehen;
        "Preset-Nr." wählen (0 .. 107);
        "recall"-Button von "file&table&para" klicken;
         20 sec. warten;
        "start" bei "MORPH" klicken;
            sollte schon morphen.


    b.)  wer es genauer wissen will:


        Die Bedienungs-Oberfläche von "morph06.pat" lässt sich in
    folgende Teile gliedern:
             ( Bezüglich der Schreibweise: unter "Anführungs-Zeichen
    stehende, unterstrichene Begriffe"
                        sind Bedienungs-Elemente des Patches )




       * System & Priority & Help


    Hier wird fts gestartet und gestoppt ("start", "stop").
    Wenn die cpu-Leistung von fts unter 85 % liegt, kann die
    fts-priority eingeschalten werden; dann gibt es keine Aussetzer
    mehr (Toggle-Switch von "ftspriority").
    Um Patcher leichter zu öffnen, oder um Numberboxes leichter zu

    beschreiben, soll man fts stoppen und später wieder starten.
    Bei "help" erscheint dieser Text.




       * 5-Table-Editor


    Hier kann man gerade Linien-Stücke innerhalb einer Table zeichnen.


    Dafür wählt man zuerst die Table ("sf1", "sf2", "fm", "am",
    "vib2"), dann x1, x2, y1, y2 und klickt dann "line".
    Um die Veränderung auch zu hören, muss man noch "store" bei
    "table-only" klicken, damit der Table-Inhalt in den
    Table-Interpolierer kopiert wird ( siehe File & Table & Para ).
    Mittels "copy" wird die gewählte Table in einen Copy-Buffer
    geladen, mittels "paste" kann man den Copy-Buffer in eine
    neugewählte Table speichern.
     "copy" & "paste" funktioniert nicht nur innerhalb eines
    Parameter-Presets, sonder gilt auch von einem Table-Preset zu
    einem anderen.
    Auch hier gilt wieder: um die Veränderung auch zu hören, muss man
    noch "store" bei "table-only" klicken, damit der Table-Inhalt in
    den Table-Interpolierer kopiert wird.




       * Click-Editable-Tables


    Falls eine der 5 Tables geschlossen wurde, kann man sie hier
    wieder öffnen (Doppel-Klick auf die jeweilige "table" ).




       * MORPH


    Slider "out-gain" ist für Aufnahme- und Ausgangs- Lautstärke
    zuständig.
    Mittels "start"-Button startet man:
        1. den gewählten Morph, und
        2. recordet ihn gleichzeitig in ein 35 sec. Sample, und
        3. recordet mit einem Delay von "crossfade beg." ms ein
    Stereo-Sample von 1 sec.
            (   Die beiden Kanäle sind: Original-File-Sample und das
                um 10 ms verzögerte Ergebnis der add. Synthese    )
    Mittels "stop" unterbricht man frühzeitig den Morph, bzw. man
    bringt
        die "morph_engine" in einen definierten Anfangs-Zustand.
    Mittels "sync" kann man, nach erstmaligen Abspielen des Morphs,
        die Zeit des maximalen Kreuz-Korrelations-Wertes vom
        Stereo-Sample automatisch nach "samp.del." übertragen.
            (   damit beim Crossfade die Phasen von Sample und add.
    Synth. gleich sind    )
    Mittels "save_as" wird der recordete Morph dann in einem gewähltem
    Soundfile gespeichert (*.snd).
    Die "dB" Number-Box zeigt den Spitzen-Pegel von DAC bzw.
    Morph-Recorder an.
     "_open_addan1" öffnet und interpretiert die Quell-Dateien ( *.ADD
    und *.F0 ) für das File1 des add. Synthese-Controllers,
        und speichert den Datei-Namen unter der aktuellen
    Preset-Number.
    "_open_addan2" öffnet und interpretiert die Quell-Dateien ( *.ADD
    und *.F0 ) für das File2 des add. Synthese-Controllers,
        und speichert den Datei-Namen unter der aktuellen
    Preset-Number.
    "_open_samp" öffnet das Soundfile ( *.snd im Sun/Next-Format ) ,
    dass am Beginn des Morphs dann übergblendet wird auf die add.
    Synthese,
        und speichert den Datei-Namen unter der aktuellen
    Preset-Number.




       * File & Table & Para


    Hier wird zuerst der gewünschte Preset gewählt: 0 ... 107.
    Mittels "load" und "save" werden die Presets geladen bzw.
    gespeichert.
    Mittels "recall" werden 1. die Parameter-Werte in die Numberboxes

    und in die jeweiligen Prozess-Objekte geladen,
        und 2. die Tables mit dem gespeicherten Inhalt neu gezeichnet.


    Mittels "store" werden 1. die Parameter-Werte von den Numberboxes
    in den Preset-Speicher kopiert,
        und 2. die Table-Inhalte in den Preset-Speicher und
    Table-Interpolierer kopiert.
    Um eine unnötige Verzögerung bei "recall" zu verhindern (es werden
    jedes mal neu die add. Analyse-Daten
        geladen und interpretiert, das können bis zu  2 x 10 Mbyte
    sein),
        gibt es auch "recall" von "table-only" und "recall" von
    "parameter-only".
    Die Text-Box "state" darunter gibt die jeweiligen
    Lade-Speicher-Aktivität an.


       *  File-Parameter (const.)



    Hier werden die wichtigsten Parameter der additiven Analyse
    angezeigt.
    Erste Zeile:  File 1 = z.B. Klavier;
    zweite Zeile: File 2 = z.B. Bariton.




       * Editable Parameter


    Hier werden die Morph-Parameter eingegeben bzw. angezeigt.
    Falls mehrere Number-Boxes knapp übereinander stehen, gilt:
        erste Zeile:     add. Synthese-File 1 = z.B. Klavier;
        zweite Zeile:  add. Synthese-File 2 = z.B. Bariton;
        dritte Zeile :   Sample-File;
    die lose geordneten Number-Boxes stehen für gemeinsame Parameter.
    "detune [ht]" sind Frequenz-Verstimmungs-Faktoren in Halbtönen für
    add. Synth. 1 und 2 und Sample.
        Hier sollte die Verstimmung zwischen dem add. Synth.-Wert und
    Sample-Wert übereinstimmen,
            von welchem zu Morphen begonnen wird.
    "gain [dB]" gain in dB  für add. Synth. 1 und 2 und Sample.
        Auch hier sollte die Verstärkung zwischen dem add. Synth.-Wert
    und Sample-Wert übereinstimmen,
            von welchem zu Morphen begonnen wird.
    "avrg-beg [ms]" Beginn der Berechnung von gemittelter Amplitude
    und gemittelter Frequenz für alle Partial-Töne.
    "avrg-end [ms]" Endzeitpunkt der Berechnung von gemittelter

    Amplitude und gemittelter Frequenz für alle Partial-Töne.
    "crossfade beg. [ms]" Beginn des Crossfades von Sample auf
    Morph-Quell-Add.Synthese.
    "crossfade dur. [ms]" Dauer des Crossfades.
    "morph-time [ms]" ist die gemeinsame Spiel-Dauer des Morphs.
        Daraus ergeben sich die zeitlichen Stauch/Dehn-Faktoren
    bezüglich der Differenzen von
            "end_add_synth  -  begin_add_synth  -  crossfade_beg  -
    crossfade_dur" von file 1 und 2.
        Diese Zeit bildet auch den Skalierungs-Bereich der
    Horizontal-Achse aller 5 Tables.
        Zur Berechnung der gesamten Morph-Spielzeit muss man noch
    "crossfade_beg" + "crossfade_dur" hinzu addieren.
    "vibrato2-full-scale" vertikaler Skalierungs-Faktor für die Table
    "vibrate2".
        Unten 0 % Vibrato, oben Skalierungs-Faktor * 100 % Vibrato.
    "samp.del. [ms]" Dieser Wert wird automatisch nach dem erstmaligen
    Abspielen eines Morphs
        und anschließend gedrückten "sync" gesetzt  ( siehe "sync" bei
    MORPH ).
    "osc_interpol_time [ms]" ist einerseits die Abtast-Perioden-Dauer,


        binnen der die add. Synth.-Werte "time-gestretcht"
    transformiert ausgelesen werden;
            bzw. die Interpolations-Zeit für die line~-Objekte der
    Oszillatoren.
    "# of used oscillators" Anzahl der aktiven Oszillatoren bei der
    additiven Synthese.
        Die Anzahl ist physikalisch begrenzt bei 120, und ist
    cpu-Leistungs-bedingt begrenzt bei ca. 90.

        Da immer 5-er-Banken von Oszillatoren geschalten werden, ist
    es immer sinnvoll nur Zahlen wie
            5, 10, 15 .... 75, 80, 85 zu verwenden.


       * File-Names

    Hier werden die 3 Files angezeigt, die zum Morph nötig sind:
    "add.synth.-klavier" Filename für Additive Synthese von Klavier;
    "add.synth.-bariton" Filename für Additive Synthese von Bariton;
    "sample-name" Filename für Sample, das vor dem Crossfade und
    während des Crossfades gespielt wird.


 

------------------------------------------------------------------------

5.Timing

Abkürzungen und Beschreibungen der einzelnen Parameter und der
    daraus folgenden Variablen:


    x.......................add._synth._beginning_index (1 oder 2);
    mt....................morphing_time;
    astb1................add._synth._time_begin_1;
    astb2................add._synth._time_begin_2;
    aste1................add._synth._time_end_1;
    aste2................add._synth._time_end_2;
    cfsastb.............crossfade_sample->add._synth._time_begin;
    cfsasd...............crossfade_sample->add._synth._duration;
    dtf1..................detune_factor_1;
    dtf2..................detune_factor_2;
    dtfs =: dtfx......detune_factor_sample;
    hst1..................hoppsize_time_1;
    hst2..................hoppsize_time_2;
    hstx..................hoppsize_time_x;
    hstm.................hoppsize_time_morph;


    asd1 = aste1 - astb1 ..............add._synth._duration_1;
    asd2 = aste2 - astb2 ..............add._synth._duration_2;
    asdx = astex - astbx ..............add._synth._duration_x;


    sf1 = mt / asd1 ......................stretch_factor_1;
    sf2 = mt / asd2 ......................stretch_factor_2;
    sfx = mt / asdx ......................stretch_factor_x;


    ccfsastbx = sfx * round(hstx, (cfsastb * dtfx / sfx)) / dtfx
    .........corrected_crossfade_sample->add._synth._time_begin_x;
    ccfsasdx = round(hstm, cfsasd)
    ...................................................corrected_crossfade_sample->add._synth._duration_x;


    mtbt = mt - ccfsastbx - ccfsasdx
    ...............................................morphing_table_base_time;


    Unter der Voraussetzung, dass die beiden add. Analyse-File-Daten
    auf "mt" gedehnt bzw. gestaucht werden, unterscheiden wir
    prinzipiell 3 Zeit-Intervalle:
    1.) reines Sample; [0  ...  "ccfsastbx"]
    2.) Crossfade von Sample auf add. Synthese; ["ccfsastbx"  ...
    ("ccfsastbx" + "ccfsasdx")]
            (Für einen glatten Übergang gilt: die Anfangs-Werte von
    f-morph- und a-morph-Table müssen beide entweder 0% oder 100 %
    betragen)
    3.) reine add. Synthese.  [("ccfsastbx" + "ccfsasdx")  ...  "mt"].




    Annahme: x = 1;
    Morph von 1 nach 2;


    Nach dem Start-Bang wird Sample-File (identisch zu add.
    Analyse-File 1) von 0 ms bis 2000 ms gestartet mit einer Steigung
    von 0 ms bis ("dtf1"*2000) ms.
    Bei "ccfsastbx" ms wird die Phase, Ampl. und Freq. von add.
    Synthese gesetzt;
    gleichzeitig werden die Freq.- und Ampl.-Werte der
    Oszillatoren-line~-Objekte mit den Rampen-Werten zur Zeit
    ("ccfsastbx" + "hstm") ms beschickt;
    zur selben Zeit wird die Minimal-Fehler-Analyse gestartet.
    Die nächsten "ccfsasdx" ms wird vom Sample auf die add. Synthese
    übergeblendet;
    das Sample wird noch weiter ausgelesen.
    Bei ("ccfsastbx" + "ccfsasdx") ms angekommen, ist das Sample
    völlig ausgeblendet, die add. Synthese voll eingeblendet.
    Ab diesem Zeitpunkt wird das erste mal über die Tables
    transformiert;
         der Zeitpunkt "ty" in Echtzeit wird folgendermaßen in die
    add. Analyse-Zeit-Vektoren transformiert:
            (Annahme: die Tables sind 128 x 128 groß)


    tya = ty - (ccfsastbx + ccfsasdx);
    if(tya < 0) {tyd1 = tyd2 = tya};
    else
        {
        tyb = 128 * tya / mtbt;
        tyc1 = mtbt * Stretch-Table_1(tyb) / 128;
        tyc2 = mtbt *Stretch-Table_2(tyb) / 128;
        tyd1 = tyc1 + (ccfsastbx + ccfsasdx);
        tyd2 = tyc2 + (ccfsastbx + ccfsasdx);
        }
    tye1 = tyd1 / sf1;
    tye2 = tyd2 / sf2;
    Ampl1-Freq1 = interpol(tye1);
    Ampl2-Freq2 = interpol(tye2).


    Während der Crossfade-Periode extrapoliert man die 5 Tables nach
    folgender Vorschrift:
    die beiden Stretch-Tables werden im neg.-neg.-Quadranten als 45
    Grad-Gerade interpretiert;
    für die beiden Morph-Tables und die Vibrato2-Table gilt: die
    negativen Zeit-Werte werden auf Null geclippt.
        (Vorausgesetzt die Table-Werte sind in den richtigen
    Extrem-Zuständen)


    Am Ende bei "mt" ms angekommen, wird der Morphing-Prozess beendet,
    indem alle Partial-Amplituden auf 0.0 gesetzt werden.

 

------------------------------------------------------------------------

6.Tables:

       * stretch1


    vertikal:         Sample-Ort von File1 = Klavier;
    horizontal:     Morph-Basis-Zeit;


       * stretch2


    vertikal:          Sample-Ort von File2 = Bariton;
    horizontal:      Morph-Basis-Zeit;


       * f-morph


    vertikal:          Frequenz-Morph-Parameter  (0 = 100 % Klavier;
    127 = 100 % Bariton);
    horizontal:      Morph-Basis-Zeit;


       * a-morph


    vertikal:          Amplituden-Morph-Parameter  (0 = 100 % Klavier;
    127 = 100 % Bariton);
    horizontal:      Morph-Basis-Zeit;


       * vibrate2


    vertikal:          Vibratio-Parameter von File2 ( 0 = 100 %
    devibriert; [127 / vibrato2-full-scale] =
    Original-Bariton-Vibrato;


    127 = 100 * vibrato2-full-scale % Bariton-Vibrato );
    horizontal:      Morph-Basis-Zeit;

 

------------------------------------------------------------------------

7.File-Struktur

    vom home-Verzeichnis aus ( z.B. ~ = /Net/iem/Benutzer/rrh )  wird
    folgender Ordner-Baum aufgebaut:


    ~/fts/lib
    für Max-fts-Projekt-Bibliotheken.


    ~/fts/lib/config/origin
    ~/fts/lib/config/o2r10k
    ~/fts/lib/config/o2r5k
    für die verschiedenen Architekturen die jeweiligen
    IO-Konfigurationen.


    ~/fts/lib/iem
    für die max-startup-scripts mit iem-Bibliothek und dem
    iem-Klassen-Patch.
    ~/fts/lib/iem/abs
    für die Abstraktions-Patches der iem-Bibliothek.
    ~/fts/lib/iem/help
    für die help-Patches der iem-Bibliothek-Abstraktions-Patches
    und der iem-Bibliothek-externals.


    ~/fts/lib/morph_k
    für die max-startup-scripts mit iem-Bibliothek, morph_k-Bibliothek


    und dem morph_k-Klassen-Patch.
    ~/fts/lib/morph_k/abs
    für die Abstraktions-Patches der morph_k-Bibliothek.
    ~/fts/lib/morph_k/help
    für die help-Patches der morph_k-Bibliothek-Abstraktions-Patches
    und der morph_k-Bibliothek-externals.


    ~/fts/lib/morph_k/addan/klav
    ~/fts/lib/morph_k/addan/bla
    ~/fts/lib/morph_k/addan/ble
    ~/fts/lib/morph_k/addan/bli
    ~/fts/lib/morph_k/addan/blo
    ~/fts/lib/morph_k/addan/bll
    ~/fts/lib/morph_k/addan/blm
    für die Ergebnisse der additiven Analyse mittels
    "addan"-Programmes;
    klav ... Klavier, bla ... bariton_lang_A, ble ... bariton_lang_E,
    bli ... bariton_lang_I, blo ... bariton_lang_O, bll ...
    bariton_lang_L, blm ... bariton_lang_M;
    man muss die Analyse-Dateien *.ADD und *.F0 (partials und
    fundamental) mittels "Fetch"-Programm in das Unix-Netz kopieren
    und dann unbenennen ( im jeweiligen Ordner mit den jeweiligen
    extensions );
    z.B. Bariton_lang_A in bla; Bariton_kurz_L in bkl;
    *.ADD in *.add;
    *.F0 in *.f0;
    und nur die Kurzbezeichnung der Tonhöhe verwenden:
    gg für GG = G, hh für HH = H, cis für CIS = #c, e für E = e, fis
    für FIS = *f, ais für AIS = #a, c1 für C1 = c1, es1 für ES1 = be1,
    f1 für F1 = f1.


    ~/fts/lib/morph_k/sound/klav
    ~/fts/lib/morph_k/sound/bla
    ~/fts/lib/morph_k/sound/ble
    ~/fts/lib/morph_k/sound/bli
    ~/fts/lib/morph_k/sound/blo
    ~/fts/lib/morph_k/sound/bll
    ~/fts/lib/morph_k/sound/blm
    für die jeweiligen Original-Sounds der additiven Analyse;
    das "addan"-Programm benötigt ein *.aiff-File, dieses muss man
    mittels "Fetch"-Programm in das Unix-Netz kopieren und eventuell
    erst mit der extension *.aiff versehen;
    dann in ein *.snd umwandeln und in den jeweiligen richtigen Ordner
    moven.


    ~/fts/lib/morph_k/presets
    für die jeweiligen Presets von Morph.pat;
    morph_kbl steht für morph, klavier, Bariton, lang;
    pbank.fix steht für pbank-object Fix-Parameter = Filenames;
    fibank.para steht für float-int-bank-object mit variablen
    Parameter;
    tab.amorph steht für table-pool-object mit speicherbaren
    table-sets und Amplituden-Morph-Verlauf;
    tab.fmorph steht für table-pool-object mit speicherbaren
    table-sets und Frequenz-Morph-Verlauf;
    tab.vibrate2 steht für table-pool-object mit speicherbaren
    table-sets und Vibrations-Verlauf von File 2;
    tab.stretch1 steht für table-pool-object mit speicherbaren
    table-sets und Time-Stretching-Verlauf von File 1;
    tab.stretch2 steht für table-pool-object mit speicherbaren
    table-sets und Time-Stretching-Verlauf von File 2.


    ~/fts/lib/origin
    ~/fts/lib/o2r10k
    ~/fts/lib/o2r5k
    für die verschiedenen Architekturen die jeweiligen dynamisch
    link-baren Bibliotheks-Dateien von iem und morph_k.

 

------------------------------------------------------------------------

Institute of Electronic Music and Acoustics