Frage von Trolleule:Hallo,
ich versuch mich gerade mit scripting in After Effects bzw. mit expressions. Ich hab mir einen einfach Text erstellelt "Das ist ein normaler Text" und den Schreibmaschinen-Effekt aus den Text presets angewendet.
Jetzt möchte ich bei den jeweiligen Buchstaben, das AE automatisch eine wave Datei abspielt die ich als Footage importiert habe: "space.wav"
Ich kenn mich mehr oder weniger gut mit C++, php und javascript und dachte mir daher ich lese zuerst die Länge des Textes aus und über den Index den ich hochzähle wird jeweils die wav abgespielt, alles nur theorie bisher praktisch schon ein wenig rumprobiert, stelle mir nun die Frage ist das möglich?
Antwort von Mylenium:
Time-Remapping + valueAtTime(). Da AE aber kein Soundprogramm ist, ist das relativ sinnfrei - Wahwah und Pitch-Shift garantiert!
Mylenium
Antwort von Trolleule:
das sind aber keine befehle mit denen ich die wav datei in die timeline platziere bzw die abspiele, ich will mir das manuelle platzierne in der timeline sparen und das durch einen algorithmus durchführen lassen geht das auch?
Danke!
Antwort von Mylenium:
das sind aber keine befehle mit denen ich die wav datei in die timeline platziere bzw die abspiele,
Höh? Natürlich sind sie das. Wenn du gotoandplay() suchst, dann wohl eher Flash oder Director.... Nich böse sein, aber es würde schon helfen, wenn du dich mal da reindenkst, wie AE überhaupt funktioniert anstatt nun einfach Vorhgehensweisen aus anderen Programmen zu kopieren. Ist doch nun völlig wurscht, ob die Dateien entsprechend auf der Timeline platziert sind oder per expressiongesteuertem Time-Rampping einfach nur zur richtigen Zeit abgespielt werden, oder? Und wenn du's wirklich platzieren mußt, dann mußt du halt mit'ner Combo aus Expressions und Script arbeiten, is ja durchaus möglich...
Mylenium
Antwort von Trolleule:
versteh ich echt nicht, anstatt die wav 25x auf die timeline manuell zu ziehen möchte ich das automatisch machen. Time Remap verändert doch nur die Dauer oder?
...ob die Dateien entsprechend auf der Timeline platziert sind oder per expressiongesteuertem Time-Rampping einfach nur zur richtigen Zeit abgespielt werden...
wenn das geht brauch ich die wav nicht in der timeline platzieren - gut - aber wie kann ich die wav 25x abspielen lassen über expression? könntest du mir ein Beispiel geben oder die syntax, bitte?
Antwort von Mylenium:
wenn das geht brauch ich die wav nicht in der timeline platzieren - gut - aber wie kann ich die wav 25x abspielen lassen über expression? könntest du mir ein Beispiel geben oder die syntax, bitte?
Na zum einfachen Abspielen des Clips brauchste nur die aktuelle Zeit und setzt sie immer wieder auf Null den Anfangswert, wo dein Audioclip nun real anfängt. Deine Bewegung der Buchstaben holste dir ganz normal über Boole und entsprechende Thresholds, siehe hier:
http://www.motionscript.com/design-guid ... igger.html einfach den Audio level durch deine Maxima im Positionsanimator ersetzen. Oder ganz konventionell gleich die keyframes abfragen. Wenn du das hast, isses dann einfach nur noch
thisProperty.valueAtTime(time-eventTime), wo eben die
eventTime aus deinem Trigger kommt. Sinn der ganzen Übung: Zeit wird imemr auf Null gesetzt, läuft dann aber weiter, um den Ton auch abzuspielen. Und wie gesagt, das ganze auf's Time Remapping. Um eventuellen Problemen mit abgehackten Tönen aus dem Weg gehen, halt vielleicht mindestens zwei oder 3 identische Tonspuren haben und die dann per n%x jedem 2. oder 3. Event zuordnen oder ebn für jedes Event eine Spur und dann eventID = index....
Mylenium
Antwort von Trolleule:
vorab: ich möchte nicht die bewegung an die wav anpassen, wie es in dem Beispiel gezeigt wird sondern die wav an die Bewegung.
Na zum einfachen Abspielen des Clips brauchste nur die aktuelle Zeit und setzt sie immer wieder auf Null den Anfangswert, wo dein Audioclip nun real anfängt.
d.h. ich brauch die wav nur 1x in der timeline, diese wird abgespielt und die zeit von der Ebene wird auf null zurückgesetzt? gut, aber wo schreib ich den code rein? "quelltext" (text.sourceText) oder Anfang (text.animator("Animator 1").selector("Bereichsauswahl 1").start)
Deine Bewegung der Buchstaben holste dir ganz normal über Boole und entsprechende Thresholds, siehe hier: http://www.motionscript.com/design-guid ... igger.html einfach den Audio level durch deine Maxima im Positionsanimator ersetzen.
ich bin anders vorgegangen: Schreibamschineneffekt aus den Textpresets.
Oder ganz konventionell gleich die keyframes abfragen. Wenn du das hast, isses dann einfach nur noch thisProperty.valueAtTime(time-eventTime), wo eben die eventTime aus deinem Trigger kommt.
ich hab doch nur zwei keyframes.
Antwort von Mylenium:
- Expressions geghören immer in das Property, dass sie verändern sollen. In deinem Fall also in das Time Remap.
- Andere Properties werden einfach über die Hierarchie abgegriffen.
thisComp.layer("XYZ").text.animator("XYZ").property.rotation
Wie diese Verdrahtung nun aussieht und welche Parameter du brauchst, hängt vom konkreten Fall ab.
- Es spielt keine Rolle, ob die Properties selbst nun per Keyframes oder Expressions animiert sind. Das mit dem Threshold war ja nur'n Vorschlag. Für Schreibmaschine wäre vielleicht sogar eine einfachere vorgehensweise praktikabel - die entsprechenden Animatoren in der Textebene von Prozent auf Index umstellen (unter Advanced), dann wäre jedes Umspringen des Index' ein Ding oder Dong. Das sind genau die Zeiten, die valueAtTime() braucht.
Mylenium
Antwort von Trolleule:
Vielen Dank für deine Mühen.
Also ich aktiviere Time Remap von meinem audio layer und platziere dort den code.
meinst du mit index z.B.
x = text.sourceText.length
x bis x
??
beim hochzählen des indexs jeweils die wav ausführen?
Edit: sorry du meinst was anderes mit index, aber wie bring ich das alles zusammen, der clip b rauch ja eine bedingung wann er ausgeführt werden soll und dann muss ich das valueAtTime() noch integrieren?
wäre nett wenn du das auf syntax-Ebene erläutern könntest.
Antwort von Trolleule:
Hallo, kannst du mir weiter helfen ich kriegs einfach nicht hin :/
ich komm einfach nicht auf die programmier Logik kla, bin an dem Punkt angelangt:
t = thisComp.layer("Das ist ein normaler Text").text.animator("Animator 1").selector("Bereichsauswahl 1").start
if(t == 9.0){
thisProperty.valueAtTime(time+0)
}
ich versuch erstmal die wav zum Zeitpunkt eines sich ändernden wertes abzuspielen, also wenn Anfang 9.0 erreicht hat, wav abspielen und z.B. bei 10.0 wieder abspielen, wäre sehr nett wenn du mir auf die Sprünge helfen könntest.