סאונד ב-FP10 או SoundMixer.computeSpectrum vs. SamplesCallbackEvent
בגלל שלא ניתן לחקור את האלמנטים שקשורים בתקשורת עד שתצא גרסה חדשה של FMS, החלטתי לחקור את שאר הפיצ'רים החדשים ובראש ובראשונה את המדיה. אז הנה סקירה ראשונה של החידושים באובייקט Sound.
ישנם שתי אופציות חדשות ב-FP10 והן:
<method name="extract" declaredBy="flash.media::Sound" returnType="Number" uri="http://www.adobe.com/2008/actionscript/Flash10/">
<parameter index="1″ type="flash.utils::ByteArray" optional="false"/>
<parameter index="2″ type="Number" optional="false"/>
<parameter index="3″ type="Number" optional="true"/>
</method>
הפונקציה extract של אובייקט Sound מעבירה ל-ByteArray את ה-Sound samples מאובייקט ה-Sound, הפרמטר השני מגדיר את כמות האודיו להעביר והפרמטר השלישי את ה-position ב-Sound (אם הוא לא מוגדר, ההעברה היא מהמקום האחרון בו נמצא ה-Sound). הפונקציה מחזירה מספר שהוא מספר ה-samples שהועברו ל-ByteArray.
האופציה השניה היא Event handler שמתרחש בארוע שהוא "samplesCallback", שמתרחש בכל אינטרבל מסויים ומבקש מידע של Sound. ב-callback צריך להכניס לתוך אובייקט מסוג ByteArray Sound.samplesCallbackData, כמות מסויימת של samples המות יכולה להיות בין 512 ל-8192 samples עבור כל קריאה של ה-event. הבחירה תלויה במפתח, ככל שהערך נמוך יותר ה-event יקרא יותר פעמים וייווצר overhead בנגן, וככל שהערך גבוה יותר ה-latency יהיה גבוה יותר. זהו האובייקט שצריך למלא:
<accessor name="samplesCallbackData" access="readonly" type="flash.utils::ByteArray" declaredBy="flash.media::Sound" uri="http://www.adobe.com/2008/actionscript/Flash10/"/>
ה-Event עצמו יורש מ-flash.events:Event ומכיל גם פרמטר position.
<type name="flash.events::SamplesCallbackEvent" base="Class" isDynamic="true" isFinal="true" isStatic="true">
…
<accessor name="position" access="readwrite" type="Number" declaredBy="flash.events::SamplesCallbackEvent"/>
<method name="clone" declaredBy="flash.events::SamplesCallbackEvent" returnType="flash.events::Event"/>
<method name="toString" declaredBy="flash.events::SamplesCallbackEvent" returnType="String"/>
…
</type>
על ידי שתי האופציות האלה ניתן למעשה לקרוא מידע מקובץ MP3 או ליצור מידע אודיו בקוד ולכתוב אותו לתוך אובייקט סאונד חדש ולהשמיע אותו. אני מניח שההמשך הטריויאלי לדבר הזה הוא לערוך קובץ MP3 שנטען מהמשתמש ולאפשר לו להוריד אותו, לאחד שני קבצי MP3 לשני Channels שונים, ליצור מכונה שמפיקה צלילים על בסיס Flash Client בלבד ועוד היד נטויה.
כאשר ראיתי את האופציה של טעינת Sound לתוך ByteArray, חשבתי לעצמי הרי האופציה הזאת כבר קיימת ומיושמת עם אקולייזרים שזזים בהתאם ל-ByteArray שמנותח מהמידע של ה-Audio בזמן מסויים על ידי SoundMixer.computeSpectrum, להזכירכם, הפונקציה מאפשרת לדגום את האודיו שמנוגן בזמן נתון ולהמיר אותו ל-ByteArray וכך ניתן להשתמש בפרמטרים המוזנים ולעשות בהם שימוש ויזואלי, כמו זה. באופציה החדשה ישנם 2 הבדלים: האחד טריוויאלי, האפשרות לטעון Sound לאובייקט ולא רק לקבל ממנו, והשני הוא שה-Event לא צריך להיות מונע באמצעות זמן, ה-SoundMixer.computeSpectrum תופס Snapshot של מידע האודיו בזמן נתון אבל לא עוקב אחרי תנועת ה-packets עצמם אבל באובייקט החדש, ה-Event עוקב אחרי תנועת ה-packets ובצורה כזו יש מעקב אחרי המידע ואין חורים של זמן בין הדגימות. נחמד.





תגובות אחרונות