16.2 Sound mit ActionScript
Wie Sie Sound steuern, der in einem Schlüsselbild steckt, werden Sie aufgrund Ihres Wissens aus den letzten Kapiteln bereits ahnen: Da der Sound synchron zur Animation abläuft, müssen Sie den Abspielkopf anhalten und weiterspielen lassen. Hierfür dienen die Methoden zur Filmsteuerung, die wir Ihnen in Kapitel 5, »Einfache Filmsteuerung«, ausführlich gezeigt haben.
Interessanter sind die globalen Steuerungsmöglichkeiten und vor allem die Sound-Klasse, mit deren Hilfe Sie Sound steuern und direkt aus der Bibliothek laden können.
Globale Steuerung
Für die globale Steuerung von Sound gibt es eine globale Eigenschaft und eine globale Funktion:
- _soundbuftime ist eine globale Eigenschaft; sie gibt die Verzögerung in Sekunden an, die ein Streaming-Sound braucht, bis er gestartet wird. Es handelt sich um einen Puffer, der verhindert, dass der Sound einen Aussetzer zwischendrin hat. Der Standardwert liegt bei fünf Sekunden, die meistens ausreichen. Sie können aber auch einen anderen Wert angeben:
_soundbuftime = 10;
- stopAllSounds() ist eine globale Funktion, die alle Sounds im Dokument anhält, nicht aber den Abspielkopf. Trifft dieser erneut auf Streaming-Sound, geht der Sound weiter. Diese Funktion ist auch das einzige, was hinter dem Verhalten Alle Sounds stoppen steckt:
stopAllSounds();
Sound-Klasse
Praktischerweise hat Macromedia sämtliche Funktionalität, die Sie für die Arbeit mit einem bestimmten Sound brauchen, in eine Klasse gepackt.
Im Aktionen-Bedienfeld ist sie unter ActionScript 2.0-Klassen • Medien • Sound (Integrierte Klassen • Medien • Sound) zu finden. Und so arbeiten Sie mit der Sound-Klasse:
Abbildung 16.3 Die Sound-Klasse im Eigenschafteninspektor
1. | Zuerst instanziieren Sie ein neues Sound-Objekt: |
var soundname_sound:Sound = new Sound();
-
- Beachten Sie die Dateiendung _sound für Codehinweise zum Sound-Objekt in Flash 8, MX 2004 und MX.
2. | Anschließend fügen Sie mit der Methode attachSound(Exportverknüpfung)attachSound() (Methode) einen Sound zu diesem Objekt hinzu: |
soundname_sound.attachSound("musik_sound");
-
- Dieser Sound existiert bis jetzt nur in der Bibliothek. Das heißt, Sie müssen ihn von dort exportieren, damit ActionScript ihn überhaupt kennt. Dies erledigen Sie im Dialogfenster Verknüpfungseigenschaften. Klicken Sie zum Einblenden mit der rechten Maustaste auf den Sound und wählen Sie Verknüpfung.
3. | Nun können Sie auf den Sound zugreifen und ihn beispielsweise mit der Methode start(Startzeitpunkt, Schleifenwiederholungen)start() (Methode) abspielen lassen. Mit Parametern legen Sie fest, an welcher Stelle der Sound starten und wie oft er abgespielt werden soll; beide Paramter sind allerdings optional. Der Startzeitpunkt wird in Sekunden angegeben und bezieht sich auf den Sound selbst; ein Start bei 15 Sekunden bedeutet also, der Sound startet an seiner fünfzehnten Sekunde. In der folgenden Zeile startet er sofort und läuft viermal: |
Export- und Soundname |
Wir wählen gerne für den Export- und den Soundnamen denselben Bezeichner. Der Grund dafür: So muss man sich weniger Namen merken. |
soundname_sound.start(0,4);
Abbildung 16.4 Im Dialogfeld aktivieren Sie Export für ActionScript und geben einen Bezeichner ein.
Tabelle 16.2 gibt einen Überblick, welche Methoden und Eigenschaften die Sound-Klasse zur Verfügung stellt.
Mit der Klasse System.capabilities können Sie testen, ob in einem System Sound zur Verfügung steht. Die Eigenschaft hasAudio überprüft, ob es Sound gibt; hasAudioEncoder stellt fest, ob Player für verschiedene Dateiformate vorhanden sind; hasMP3 testet, ob MP3-Dateien abspielbar sind. Alle drei liefern einen Wahrheitswert, der aber mit Vorsicht zu genießen ist, denn bei hasAudio wird beispielsweise nichts darüber ausgesagt, ob der Sound auch angeschaltet ist. Ein Test dieser Art ist in der Praxis nicht unbedingt notwendig und nur bedingt sinnvoll.
Nachdem Sie wissen, wie die Soundsteuerung in der Theorie funktioniert, ist es Zeit für ein praktisches Beispiel. Die Ausgangsdatei finden Sie auf der CD-ROM unter dem Namen einfache_soundsteuerung.fla für beide Flash-Versionen in den jeweiligen Ordnern. Sie besteht aus zwei Schaltflächen für das Abspielen und Anhalten des Sounds und aus einem Schieberegler für die Lautstärke.
Abbildung 16.5 Zwei Schaltflächen und ein Schieberegler sollen für die Soundsteuerung sorgen.
Methode/Eigenschaft | Beschreibung |
attachSound(Name) |
Fügt einen durch Name identifizierten, vorher exportierten Sound aus der Bibliothek an. |
duration |
Liefert die Dauer eines Sounds inMillisekunden. Diese Eigenschaft ist nur lesbar, lässt sich aber nicht ändern. |
getBytesLoaded() |
Gibt bei einem gestreamten Sound die Zahl der schon geladenen Bytes zurück. Kann mit getBytesTotal abgeglichen werden. |
getBytesTotal() |
Liefert die Gesamtzahl der Bytes eines Sounds. |
getPan() |
Liefert die Links-Rechts-Balance eines Sounds (welcher Kanal überwiegt?) mit Werten von –100 (linker Kanal) bis +100 (rechter Kanal). Vergleichbar mit dem Balance-Regler an Ihrer Stereoanlage. |
getTransform() |
Liefert ein Transformationsobjekt. Ein Transformationsobjekt ist als normales Objekt definiert und kann folgende vier Eigenschaften annehmen:
Bei Stereo-Sound sind standardmäßig alle Geräusche auf beide Kanäle gleich verteilt, also ll = 100 und rr = 100, bei Monosound sind alle Geräusche im linken Kanal (ll = 100, lr = 100). |
getVolume() |
Liefert die Lautstärke von 0 (nicht hörbar) bis 100 (sehr laut). |
loadSound(URL, Streaming) |
Diese Methode gibt es erst seit Flash MX. Dient zur Arbeit mit MP3-Dateien und lädt eine Datei von einer URL. Der zweite Parameter gibt an, ob die Datei im Streaming geladen werden soll: Abspielen des Sounds beginnt schon beim Laden (true). Wenn nicht (false), handelt es sich um Ereignis-Sound, der vollständig geladen werden muss, bevor das Abspielen startet. Dies ist z. B. beim Klicken einer Schaltfläche sinnvoll, da hier ein verzögertes Streaming unsinnig ist. |
position |
Gibt an, wie viele Millisekunden der Sound schon abgespielt wurde. Diese Eigenschaft ist nur lesbar. |
setPan(Balance) |
Setzt die Links-Rechts-Balance mit Werten von --100 (links) bis +100 (rechts). |
setTransform(Transformationsobjekt) |
Setzt ein Transformationsobjekt (siehe Erläuterung bei getTransform). |
setVolume(Lautstärke) |
Bestimmt die Lautstärke von 0 (nicht hörbar) bis 100 (sehr laut). |
start() start(Start, Wiederholung) |
Startet einen Sound. Optional können Sie den Startzeitpunkt in Sekunden und die Anzahl der Abspielwiederholungen angeben. Der Startzeitpunkt ist die Sekunde des Sounds, ab der er abgespielt wird. Ist ein Sound 10 Sekunden lang, bedeutet ein Startzeitpunkt bei 5 Sekunden, dass der Sound ab der Hälfte gespielt wird. |
stop() stop(Name) |
Hält alle Sounds bzw. den Sound mit dem angegebenen Namen an. |
Tabelle 16.2 Wichtige Methoden und Eigenschaften für Sound
Schritt für Schritt: Einfache Soundsteuerung
Für die zwei Schaltflächen arbeiten Sie mit Ereignisprozeduren, der Code landet folglich im ersten Schlüsselbild der Hauptzeitleiste auf der Ebene ActionScript. Der Code für den Schieberegler steht in der MovieClip-Instanz des Reglers.
Zuerst instanziieren Sie ein neues Sound-Objekt:
var musik_sound:Sound = new Sound();
Fügen Sie anschließend mit attachSound(Exportname) den Sound hinzu:
musik_sound.attachSound("lied1");
Der Sound wurde vorher in der Bibliothek via Kontextmenü (Befehl Verknüpfung) für ActionScript mit dem Namen lied1 exportiert.
Als Nächstes programmieren Sie die Ereignisprozedur für die Abspiel-Schaltfläche (Instanzname abspielen_btn):
abspielen_btn.onRelease = function() { var position:Number = musik_sound.position / 1000; musik_sound.stop(); musik_sound.start(position, 20000); };
Diese Konstruktion ist sehr komplex: Die erste Zeile in der Ereignisprozedur stellt die aktuelle Position im Sound fest und wandelt sie in Sekunden um. Die zweite Zeile hält die Musik an und beginnt den Sound wieder an der gespeicherten Position.
Erkennen Sie den Grund für die Komplexität? Die Konstruktion fängt ab, wenn der Nutzer die Abspiel-Schaltfläche mehrmals hintereinander drückt. Wenn Sie nur musik_sound.start(0, 20000); schreiben, wird der Sound mehrmals gestartet und überlagert sich selbst.
Übrigens, eine richtige Endlosschleife für Sound gibt es nicht. Allerdings erzielen Sie einen ähnlichen Effekt, wenn Sie als Wert für die Wiederholung eine sehr hohe Zahl wählen.
Die Schaltfläche zum Anhalten des Sounds realisieren Sie einfacher:
stoppen_btn.onRelease = function() { musik_sound.stop(); };
stop() hält die Musik an der Stelle an, wo sie sich gerade befindet. Von dort geht es mit dem Abspielen später weiter. Hier sind viele Varianten denkbar.
5. | Vorbereitungen für den Schieberegler |
Wechseln Sie in die Aktion für den MovieClip des Lautstärke-Reglers und definieren Sie dort die Koordinaten für den Regler:
onClipEvent (load) { var mposoben_num:Number = _y-150; var mposunten_num:Number = _y; var mposlinks_num:Number = _x; var mposrechts_num:Number = _x; _y += 0; }
Die Koordinaten sind die Begrenzung, innerhalb der Drag & Drop für den Regler möglich sein soll.
Starten Sie anschließend Drag & Drop mit den Koordinaten zur Begrenzung, wenn der Nutzer auf den Regler klickt:
on (press) { startDrag(this, false, mposlinks_num, mposoben_num, mposrechts_num, mposunten_num); }
Beim Loslassen der Maustaste beenden Sie das Ziehen des Reglers:
on (release) { stopDrag(); }
Passen Sie jetzt die Lautstärke des Musikstücks mit der Methode setVolume(Lautstärke) an:
onClipEvent (enterFrame) { this._parent.musik_sound.setVolume(Math.round(100+(mposoben_num-_y)*0.67)); }
Da die Lautstärke von 0 bis 100 eingestellt wird, die Koordinaten für den Regler aber bis 150 reichen, müssen Sie den Wert anpassen.
Die fertige Datei finden Sie unter dem Namen einfache_Soundsteuerung_AS2.fla im Ordnern Flash8 bzw. FlashMX2004 und unter einfache_Soundsteuerung_AS1.fla im Ordner FlashMX auf der CD-ROM.
Externer Sound
Sound wird normalerweise ein Teil des Flash-Films. Extern geladen werden können nur MP3-Dateien und dies erst seit Flash MX. Dafür zuständig ist die Methode loadSound(Adresse, Streaming). Der erste Parameter ist die Adresse der MP3-Datei, der zweite ein Wahrheitswert, der angibt, ob die Datei als Streaming-Sound (true) oder Ereignis-Sound (false) geladen werden soll. So arbeiten Sie mit loadSound:
1. | Zuerst instanziieren Sie ein Sound-Objekt: |
musik_sound = new Sound();
2. | Dann laden Sie den Sound: |
musik_sound.loadSound("musik.mp3", true);
ID3 |
Flash 8 und MX 2004 erlaubt den Zugriff auf so genannte ID3-Dateien. Das sind Metadateien für MP3-Musikstücke. Sie enthalten eine Beschreibung zu Musikstück, Album, Interpreten und vielem mehr. Mit ActionScript greifen Sie darauf zu. Das zugehörige Ereignis ist onID3, die Eigenschaften finden Sie im Aktionen-Bedienfeld unter ActionScript 2.0-Klassen • Medien • Sound • Objekte • id3 (Flash MX 2004: Integrierte Klassen • Medien • Sound • Objekte • id3). |
Wenn der Sound fertig ist …
Mit dem Ereignis soundComplete können Sie Aktionen ausführen, wenn der Sound komplett abgespielt wurde (inklusive aller Schleifenwiederholungen!). Und so testen Sie onSoundComplete als Ereignisprozedur:
_root.musik_sound.onSoundComplete = function() { trace("Sound abgespielt"); };
Dieses Ereignis hat wesentlich mehr Bedeutung, als es auf den ersten Blick erkennen lässt. Sie können mit seinem Einsatz Animationen mit Sound synchronisieren und erst dann eine neue Animation starten, wenn der Sound zur ersten Animation abgespielt ist.
Das zweite Ereignis für Sound ist load; es gibt den Zeitpunkt an, wann ein Sound geladen wird.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.