summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiernov <piernov@piernov.org>2014-03-13 16:48:55 +0100
committerpiernov <piernov@piernov.org>2014-03-13 16:48:55 +0100
commitc9af7bb67bfefc3f37b4cdd4a066a29138f202b3 (patch)
tree93bbee2437b6f78fb7f46d1193d00279b6852c35
downloadSynthe3000-master.tar.gz
Synthe3000-master.tar.bz2
Synthe3000-master.tar.xz
Synthe3000-master.zip
Importation du projetHEADmaster
-rw-r--r--Html/Agenda.html26
-rw-r--r--Html/AlexBrush-Regular.ttfbin0 -> 49020 bytes
-rw-r--r--Html/Capture-1.pngbin0 -> 136531 bytes
-rw-r--r--Html/Capture.pngbin0 -> 21231 bytes
-rw-r--r--Html/Cercle.pngbin0 -> 12460 bytes
-rw-r--r--Html/Distance.pngbin0 -> 13096 bytes
-rw-r--r--Html/Distance.tex25
-rw-r--r--Html/Finalité.html20
-rw-r--r--Html/Réalisation.html133
-rw-r--r--Html/Style.css51
-rw-r--r--Processing-js/Config.pde231
-rw-r--r--Processing-js/Draw.pde86
-rw-r--r--Processing-js/Synth.pde106
-rw-r--r--Processing-js/Synthe3000.pde198
-rw-r--r--Processing-js/data/PartitionLune.pngbin0 -> 28258 bytes
-rw-r--r--Processing-js/libs/inc/Base64.js67
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/license.txt29
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/script/soundmanager2-jsmin.js104
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug-jsmin.js77
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug.js2377
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/script/soundmanager2.js5019
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/swf/soundmanager2.swfbin0 -> 2850 bytes
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/swf/soundmanager2_debug.swfbin0 -> 3280 bytes
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9.swfbin0 -> 8682 bytes
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9_debug.swfbin0 -> 16806 bytes
-rwxr-xr-xProcessing-js/libs/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zipbin0 -> 32404 bytes
-rw-r--r--Processing-js/libs/inc/WebMIDIAPI.js421
-rw-r--r--Processing-js/libs/inc/base64binary.js80
-rw-r--r--Processing-js/libs/inc/jasmid/LICENSE24
-rw-r--r--Processing-js/libs/inc/jasmid/midifile.js238
-rw-r--r--Processing-js/libs/inc/jasmid/replayer.js96
-rw-r--r--Processing-js/libs/inc/jasmid/stream.js69
-rw-r--r--Processing-js/libs/js/MIDI/AudioDetect.js69
-rw-r--r--Processing-js/libs/js/MIDI/LoadPlugin.js179
-rw-r--r--Processing-js/libs/js/MIDI/Player.js277
-rw-r--r--Processing-js/libs/js/MIDI/Plugin.js623
-rw-r--r--Processing-js/libs/js/Window/DOMLoader.XMLHttp.js130
-rw-r--r--Processing-js/libs/js/Window/Event.js1901
-rw-r--r--Processing-js/libs/js/Window/Queue.js87
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3.js93
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A0.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/A7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Ab7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B0.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/B7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb0.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Bb7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/C8.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/D7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Db8.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/E7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Eb7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/F7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/G7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb1.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb2.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb3.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb4.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb5.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb6.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-mp3/Gb7.mp3bin0 -> 12065 bytes
-rw-r--r--Processing-js/libs/soundfont/acoustic_grand_piano-ogg.js93
-rw-r--r--Processing-js/libs/soundfont/synth_drum-mp3.js94
-rw-r--r--Processing-js/libs/soundfont/synth_drum-ogg.js94
-rw-r--r--Processing-js/sketch.properties2
-rw-r--r--Processing-js/web-export/PartitionLune.pngbin0 -> 28258 bytes
-rw-r--r--Processing-js/web-export/Synthe3000.pde626
l---------Processing-js/web-export/inc1
-rw-r--r--Processing-js/web-export/index.html86
l---------Processing-js/web-export/js1
-rw-r--r--Processing-js/web-export/processing.js10203
l---------Processing-js/web-export/soundfont1
-rw-r--r--Processing/Synthe3000/Config.pde231
-rw-r--r--Processing/Synthe3000/Draw.pde86
-rw-r--r--Processing/Synthe3000/Synth.pde114
-rw-r--r--Processing/Synthe3000/Synthe3000.pde200
-rw-r--r--Processing/Synthe3000/data/CurlzMT-48.vlwbin0 -> 146194 bytes
-rw-r--r--Processing/Synthe3000/data/PartitionLune.pngbin0 -> 28258 bytes
-rw-r--r--Processing/Synthe3000/sketch.properties2
147 files changed, 24670 insertions, 0 deletions
diff --git a/Html/Agenda.html b/Html/Agenda.html
new file mode 100644
index 0000000..bcf7fcd
--- /dev/null
+++ b/Html/Agenda.html
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+
+<head>
+ <style type="text/css" media="all">
+ @import url(Style.css);
+ </style>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>Synthétiseur 3000</title>
+</head>
+
+<body>
+ <center><i><b><p>Mettre le son...</p></b></i></center>
+ <h1>Présentation du projet</h1>
+ <h2><u>L'agenda :</u></h2>
+ <p><b><u>Jeudi 23 Janvier :</b></u> Première idée de projet, ultiliser le digicode pour en faire un faiseur de son.
+ Le but étant de jouer "Au clair de la lune", on comparera la mélodie joué avec la mélodie attendu.
+ Pierre-Emmanuel s'occupe du synthétiseur utilisé afin d'avoir les sons. Arthur s'occupe des pages html ainsi que du début de la transformation du digicode.</p>
+ <p><b><u>Jeudi 30 Janvier :</b></u> Après maturation du projet, nous voulons créer un mini shyntétiseur composé de deux octaves. Le but est d'afficher une partition de musique et de la faire jouer à l'utilisateur. Un système de point pourra être mis en place afin de noter la préstation du joueur.</p>
+ <p><b><u>Jeudi 6 Février :</b></u> Le synthétiseur est terminé, la mise en forme des pages html est en cours ainsi que la conversion du projet réalisé en java script.</p>
+</body>
+
+</html>
diff --git a/Html/AlexBrush-Regular.ttf b/Html/AlexBrush-Regular.ttf
new file mode 100644
index 0000000..58c43a9
--- /dev/null
+++ b/Html/AlexBrush-Regular.ttf
Binary files differ
diff --git a/Html/Capture-1.png b/Html/Capture-1.png
new file mode 100644
index 0000000..da16e49
--- /dev/null
+++ b/Html/Capture-1.png
Binary files differ
diff --git a/Html/Capture.png b/Html/Capture.png
new file mode 100644
index 0000000..e18a85c
--- /dev/null
+++ b/Html/Capture.png
Binary files differ
diff --git a/Html/Cercle.png b/Html/Cercle.png
new file mode 100644
index 0000000..fa32803
--- /dev/null
+++ b/Html/Cercle.png
Binary files differ
diff --git a/Html/Distance.png b/Html/Distance.png
new file mode 100644
index 0000000..bb0382d
--- /dev/null
+++ b/Html/Distance.png
Binary files differ
diff --git a/Html/Distance.tex b/Html/Distance.tex
new file mode 100644
index 0000000..b562249
--- /dev/null
+++ b/Html/Distance.tex
@@ -0,0 +1,25 @@
+\documentclass[a3paper,oneside, landscape,12pt]{article}
+
+\usepackage{geometry}
+\usepackage{titlesec}
+\usepackage[utf8]{inputenc} % un package
+\usepackage[T1]{fontenc} % un second package
+\usepackage{lmodern}
+\usepackage[francais]{babel} % un troisième package
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{pstricks-add}
+
+%\color{blue}
+\geometry{margin={1in,1in}}
+%\setlength{\unitlength}{1mm}
+\renewcommand{\FrenchLabelItem}{\textbullet}
+\titlespacing*{\chapter}{0pt}{-70pt}{20pt}
+\titleformat{\chapter}[display]{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge}
+
+\begin{document}
+\noindent
+\\
+$AB = \sqrt{(x_B-x_A)^2 + (y_B-y_A)^2} \leq r$\\
+$\sqrt{(recordButtonCoordinates[0]*windowSize[0] - (float)mouseX)^2 + (recordButtonCoordinates[1]*windowSize[1] - (float)mouseY)^2} \hspace{2mm} \leq \hspace{2mm} buttonRadius*windowSize[0]$
+\end{document}
diff --git a/Html/Finalité.html b/Html/Finalité.html
new file mode 100644
index 0000000..c8637cb
--- /dev/null
+++ b/Html/Finalité.html
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+
+<head>
+<style type="text/css" media="all">
+ @import url(Style.css);
+ </style>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>Synthétiseur 3000</title>
+</head>
+
+<body>
+ <center><i><b><p>Mettre le son...</p></b></i></center>
+ <p>Finalement, nous avons réussit à faire ce que nous voulions, c'est à dire, un synthétiseur affichant une partition, la jouant et comportant un système de score comparant la musique jouée par le synthétiseur et celle jouée par l'utilisateur. </p>
+</body>
+
+</html>
diff --git a/Html/Réalisation.html b/Html/Réalisation.html
new file mode 100644
index 0000000..c51ebc2
--- /dev/null
+++ b/Html/Réalisation.html
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
+
+<head>
+<style type="text/css" media="all">
+ @import url(Style.css);
+ </style>
+ <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
+ <title>Synthétiseur 3000</title>
+</head>
+
+<body>
+ <center><i><b><p>Mettre le son...</p></b></i></center>
+ <h2>Touches Blanches</h2>
+ <table>
+ <tr><th>Code interne (note, blanche)</th><th>Code de la note</th><th>Note associée</th></tr>
+ <tr><td>1, 1</td><td>60</td><td>D34</td></tr>
+ <tr><td>2, 1</td><td>62</td><td>Ré3</td></tr>
+ <tr><td>3, 1</td><td>64</td><td>Mi3</td></tr>
+ <tr><td>4, 1</td><td>65</td><td>Fa3</td></tr>
+ <tr><td>5, 1</td><td>67</td><td>Sol3</td></tr>
+ <tr><td>6, 1</td><td>69</td><td>La3</td></tr>
+ <tr><td>7, 1</td><td>71</td><td>Si3</td></tr>
+ <tr><td>8, 1</td><td>72</td><td>Do4</td></tr>
+ <tr><td>9, 1</td><td>74</td><td>Ré4</td></tr>
+ <tr><td>10, 1</td><td>76</td><td>Mi4</td></tr>
+ <tr><td>11, 1</td><td>77</td><td>Fa4</td></tr>
+ <tr><td>12, 1</td><td>79</td><td>Sol4</td></tr>
+ <tr><td>13, 1</td><td>81</td><td>La4</td></tr>
+ <tr><td>14, 1</td><td>83</td><td>Si4</td></tr>
+ </table>
+
+ <h2>Touches Noires</h2>
+ <table>
+ <tr><th>Code interne (note, noire)</th><th>Code de la note</th><th>Note associée</th></tr>
+ <tr><td>1, 2</td><td>61</td><td>Do3#</td></tr>
+ <tr><td>2, 2</td><td>63</td><td>Ré3#</td></tr>
+ <tr><td>3, 2</td><td>66</td><td>Fa3#</td></tr>
+ <tr><td>4, 2</td><td>68</td><td>Sol3#</td></tr>
+ <tr><td>5, 2</td><td>70</td><td>La3#</td></tr>
+ <tr><td>6, 2</td><td>73</td><td>Do4#</td></tr>
+ <tr><td>7, 2</td><td>75</td><td>Ré4#</td></tr>
+ <tr><td>8, 2</td><td>78</td><td>Fa4#</td></tr>
+ <tr><td>9, 2</td><td>80</td><td>Sol4#</td></tr>
+ <tr><td>10, 2</td><td>82</td><td>La4#</td></tr>
+ </table>
+
+ <h2>Touches Blanches</h2>
+ <table>
+ <tr><th>Touche du clavier</th><th>Code de la touche</th><th>Note associée</th></tr>
+ <tr><td>Tab</td><td>9</td><td>Do3</td></tr>
+ <tr><td>A</td><td>65</td><td>Ré3</td></tr>
+ <tr><td>Z</td><td>90</td><td>Mi3</td></tr>
+ <tr><td>E</td><td>69</td><td>Fa3</td></tr>
+ <tr><td>R</td><td>82</td><td>Sol3</td></tr>
+ <tr><td>T</td><td>84</td><td>La3</td></tr>
+ <tr><td>Y</td><td>89</td><td>Si3</td></tr>
+ <tr><td>U</td><td>85</td><td>Do4</td></tr>
+ <tr><td>I</td><td>73</td><td>Ré4</td></tr>
+ <tr><td>O</td><td>79</td><td>Mi4</td></tr>
+ <tr><td>P</td><td>80</td><td>Fa4</td></tr>
+ <tr><td>^</td><td>130/514/160</td><td>Sol4</td></tr>
+ <tr><td>$</td><td>515/164</td><td>La4</td></tr>
+ <tr><td>Enter</td><td>10</td><td>Si4</td></tr>
+ </table>
+
+ <h2>Touches Noires</h2>
+ <table>
+ <tr><th>Touche du clavier</th><th>Code de la touche</th><th>Note associée</th></tr>
+ <tr><td>&</td><td>49</td><td>Do3#</td></tr>
+ <tr><td>é</td><td>50</td><td>Ré3#</td></tr>
+ <tr><td>'</td><td>52</td><td>Fa3#</td></tr>
+ <tr><td>(</td><td>53</td><td>Sol3#</td></tr>
+ <tr><td>-</td><td>54</td><td>La3#</td></tr>
+ <tr><td>_</td><td>56</td><td>Do4#</td></tr>
+ <tr><td>ç</td><td>57</td><td>Ré4#</td></tr>
+ <tr><td>)</td><td>522/169</td><td>Fa4#</td></tr>
+ <tr><td>=</td><td>61</td><td>Sol4#</td></tr>
+ <tr><td>←</td><td>8</td><td>La4#</td></tr>
+ </table>
+
+ <h2>Évènements</h2>
+ <table>
+ <tr><th>Nom</th><th>Code</th><th>Description</th></tr>
+ <tr><td>MOUSEPRESSED</td><td>0</td><td>Clic sur un bouton de l'interface</td></tr>
+ <tr><td>KEYPRESSED</td><td>1</td><td>Appuie d'une touche du clavier</td></tr>
+ <tr><td>PLAYPRESSED</td><td>2</td><td>Clic sur le bouton lecture</td></tr>
+ <tr><td>MUSICSTARTED</td><td>3</td><td>Démarrage de la musique après un PLAYPRESSED</td></tr>
+ <tr><td>MUSICFINISHED</td><td>4</td><td>Fin de la musique</td></tr>
+ <tr><td>RECORDINGSTARTED</td><td>5</td><td>Début de l'enregistrement lors du clic sur le bouton enregistrer</td></tr>
+ <tr><td>RECORDINGSTOPPED</td><td>6</td><td>Fin de l'enregistrement après un clic sur le bouton enregistrer si RECORDINGSTARTED</td></tr>
+ <tr><td>MUSICPLAYED</td><td>7</td><td>La musique a déjà été jouée une fois</td></tr>
+ </table>
+
+
+
+ <h2>Le synthétiseur</h2>
+ <p>Le synthétiseur en lui même utilise les fonctions de <code>javax.sound.midi</code>. Il est initialisé grâce à la fonction <code>initSynth()</code> puis les notes sont jouées dans la fonction <code>playNotes()</code>.</p>
+ <p>Différentes variables permettent de configurer le comportement du synthétiseur :
+ <ul>
+ <li> <code>bpm</code> = tempo de la musique</li>
+ <li> <code>nVelocity</code> = volume de la musique</li>
+ </ul>
+
+ <p><code>playNotes()</code> parcourt le tableau des notes après avoir définit l'horodatage de lancement à la variable <code>timer</code>. C'est à dire que si le nombre de millisecondes écoulées depuis le lancement du programme est supérieur à la valeur enregistrée dans timer, additionée de la durée d'une note, le curseur <code>numnote</code> passe à la note suivante.
+ La durée d'une note est définie par rapport à la seconde valeur qui lui est attribuée dans le tableau <code>notes</code>, qui est sa durée relative par rapport aux autres multipliée de la durée d'une note, c'est à dire une minute divisée par le tempo. Nous sommes en millisecondes, donc 1 minute = 60 000 millisecondes.</p>
+ <p>La fonction <code>channel.noteOn()</code> permet de jouer la note.</p>
+ <p>La fonction <code>channel.noteOff()</code> la désactive par la suite.</p>
+ <p>Le projet <code>Processing.js</code> utilise une autre bibliothèque MIDI, <code>MIDI.js</code> s'utilisant de manière assez similaire avec les fonctions <code>MIDI.noteOn()</code> et <code>MIDI.noteOff()</code>.</p>
+
+ <h2>L'interface</h2>
+ <h3>Coordonnées relatives</h3>
+<p>Afin de faciliter les ajustements de l'interface (changement de résolution, ajout d'octaves, etc…), toutes les coordonnées, qui correspondent à l'origine à une valeur en pixel, ont été converties en coordonnées relatives par rapport à la taille de la fenêtre. Ainsi, un point de coordonnées <code>(1;1)</code> correspond au point en bas à droite de la fenêtre, et un point de coordonnées <code>(0;0)</code> au point en haut à gauche. Toutes ces valeurs sont donc des nombres à virgule flottante, stockées dans des <code>float</code>.</p>
+<p><code>windowSize[]</code> est un tableau indiquant la largeur et la hauteur de la fenêtre. Cependant, avec Processing.js, il n'est pas possible de définir dynamiquement la taille de la fenêtre, ces valeurs sont donc ecrites directement dans <code>size()</code></p>
+<p>En outre, <code>windowSize[]</code> est utilisé à chaque affichage d'un élément sur l'interface, étant donné l'utilisation de coordonnées relatives par rapport à la taille de la fenêtre, il faut donc les multiplier par la largeur et la hauteur puisque Processing utilise des coordonnées absolues en pixel.</p>
+<p>Enfin, les fonctions <code>rect()</code>, <code>triangle()</code>, <code>ellipse()</code>, <code>text()</code>, <code>image()</code> ont été redéfinies afin de faciliter leur utilisation avec des coordonnées relatives. <code>super</code> n'existant pas en JavaScript, le projet <code>Processing.js</code> utilise ces mêmes noms de fonctions précédés d'un <code>d</code>.
+
+ <h3>Détection d'un clic sur un élément<h3>
+ <h4>Touches du clavier</h4>
+<p>Puisque les touches ne sont que de simples rectangles et que les touches noires sont dessinées au dessus des touches blanches, on cherche tout d'abord à détecter si le clic a été effectué au niveau du clavier (<code>mouseY >= keyboardYCoordinate*windowSize[1]</code>), puis si une touche noire est cliquée (à l'aide de <code>blackKeys()</code>). Si la première condition est validée, et que <code>blackKeys()</code> retourne 0, cela signifie qu'un clic a été effectué sur le clavier, mais pas sur un touche noire. On a donc cliqué sur une touche blanche. <code>whiteKeys()</code> permet de détecter laquelle a été cliquée.
+ <h4>Boutons circulaires</h4>
+<p>Afin de détecter un clic sur un bouton circulaire (créé avec <code>ellipse()</code>) plutôt que rectangle, le mode de calcul des coordonées n'est pas le même. On utilise ici la formule de calcul de distance entre deux points :</p>
+<img src="Distance.png" />
+<p>Ici, <code>windowSize[]</code> est utilisé puisque les coordonnées <code>mouseX</code> et <code>mouseY</code> sont en pixel par rapport à la largeur et la hauteur de la fenêtre.</p>
+<p>La distance entre le point A (le centre du cercle) et le point B (le point cliqué) doit alors être inférieure au rayon du cercle :</p>
+<img src="Cercle.png" />
+
+</body>
+
+</html>
diff --git a/Html/Style.css b/Html/Style.css
new file mode 100644
index 0000000..9f72910
--- /dev/null
+++ b/Html/Style.css
@@ -0,0 +1,51 @@
+h1
+{
+ color: blue;
+}
+
+h2
+{
+ color: red;
+}
+
+@font-face
+{
+ font-family: 'OMGDatpolice';
+ src: url('AlexBrush-Regular.ttf');
+}
+
+body
+{
+ font-family: OMGDatpolice, Verdana;
+}
+
+body
+{
+ font-size: 1.3em;
+}
+
+
+body
+{
+ background-color: #FF69B4;
+}
+
+table {
+ border: 3px solid blue;
+}
+
+tr {
+ border: 1px solid blue;
+}
+
+td {
+ border: 3px solid blue;
+}
+
+th {
+ border: 3px solid blue;
+}
+
+pre {
+ white-space:nowrap;
+}
diff --git a/Processing-js/Config.pde b/Processing-js/Config.pde
new file mode 100644
index 0000000..c3638b3
--- /dev/null
+++ b/Processing-js/Config.pde
@@ -0,0 +1,231 @@
+/* Configuration de la partition */
+int[][] notes = {
+ /* Première ligne */
+ {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 10, 1, 2
+ }
+ , {
+ 9, 1, 2
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 10, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 8, 1, 4
+ },
+/* Deuxième ligne */
+ {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 10, 1, 2
+ }
+ , {
+ 9, 1, 2
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 10, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 8, 1, 4
+ },
+/* Troisième ligne */
+ {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 6, 1, 2
+ }
+ , {
+ 6, 1, 2
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 7, 1, 1
+ }
+ , {
+ 6, 1, 1
+ }
+ , {
+ 5, 1, 4
+ },
+/* Quatrième ligne */
+ {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 10, 1, 2
+ }
+ , {
+ 9, 1, 2
+ }
+ , {
+ 8, 1, 1
+ }
+ , {
+ 10, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 9, 1, 1
+ }
+ , {
+ 8, 1, 4
+ }
+}; // Tableau de tableaux d'entiers pour les notes
+// notes[numnote][0] est la note à jouer, notes[numnote][1] est la durée de la note
+int bpm = 115; // tempo
+int timer = 0; // Initialisation du chronomètre à 0
+int numnote = 0; // La première note à jouer a l'indice 0
+String imagePartition = "PartitionLune.png";
+
+/* Configuraton du synthétiseur */
+int midiChannelNumber = 1; // Monotimbral, utilisation du 1er canal uniquement.
+int midiVelocity = 127; // Force de la note, de 0 à 127
+int baseNote = 72; // Note de base à partir de laquelle les autres seront calculées. 72 : Do4
+MidiChannel channel;
+
+
+/* Configuration de l'affichage */
+float buttonRadius = 0.025; // Rayon du cercle des boutons
+String font = "CurlzMT-48.vlw"; // Fichier de la police
+int tailleTexte = 30;
+int[] windowSize = {1130, 650}; // Largeur et hauteur de la fenêtre
+float[] keyWidth = {0.070, 0.144}; // Largeur touche noire et touche blanche
+float[] keyHeight = {0.358, 0.538}; // Hauteur touche noire et touche blanche
+float[] imageSize = {0.633, 0.461}; // Largeur et hauteur de la partition
+float[] imageCoordinates = {0.183, 0}; // Coordonnées x et y de la partition
+float[] keyXCoordinates = {0.096, 0.262, 0.518, 0.678, 0.838}; // Placement horizontal des touches noires sur une octave
+float keyboardYCoordinate = 0.462; // Placement vertical du clavier
+int numOctaves = 2; // Nombre d'octave à afficher
+String[] nomTouchesBlanches = {"Tab", "A", "Z", "E", "R", "T", "Y", "U", "I", "O", "P", "^", "$", "Enter"};
+String[] nomTouchesNoires = {"&", "é", "'", "(", "-", "_", "ç", ")", "=", "<-"};
+float[] playButtonCoordinates = {0.90, 0.10};
+float[] recordButtonCoordinates = {0.90, 0.20};
+
+
+/* Déclaration et initialisation de diverses constantes et variables */
+
+/* Gestion des évènements */
+final int MOUSEPRESSED = 0;
+final int KEYPRESSED = 1;
+final int PLAYPRESSED = 2;
+final int MUSICSTARTED = 3;
+final int MUSICFINISHED = 4;
+final int RECORDINGSTARTED = 5;
+final int RECORDINGSTOPPED = 6;
+final int MUSICPLAYED = 7;
+boolean[] events = new boolean[8];
+
+/* Stockages des touches cliquées */
+int[][] notePressed = new int[512][2]; // Un maximum de 512 notes peuvent être enregistrées
+int[][] keysPressed = {new int[numOctaves*5], new int[numOctaves*7]}; // Tableau des touches cliquées. keysPressed[0] pour les touches noires et keysPressed[1] pour les blanches
+int[][] tmpNotes = new int[notes.length][2]; // Stockage du timestamp des notes de la partition
+
+
+int score = -1;
+PImage PartitionLune;
+
+
+int[] touchesNoires = new int[523];
+int[] touchesBlanches = new int[523];
+
+/* Associations des touches du clavier aux notes */
+void defineKeys()
+{
+ // Touches blanches
+ touchesBlanches[9] = 1;
+ touchesBlanches[65] = 2;
+ touchesBlanches[90] = 3;
+ touchesBlanches[69] = 4;
+ touchesBlanches[82] = 5;
+ touchesBlanches[84] = 6;
+ touchesBlanches[89] = 7;
+ touchesBlanches[85] = 8;
+ touchesBlanches[73] = 9;
+ touchesBlanches[79] = 10;
+ touchesBlanches[80] = 11;
+ touchesBlanches[130] = 12;
+ touchesBlanches[514] = 12;
+ touchesBlanches[160] = 12;
+ touchesBlanches[515] = 13;
+ touchesBlanches[164] = 13;
+ touchesBlanches[10] = 14;
+
+ // Touches noires
+ touchesNoires[49] = 1;
+ touchesNoires[50] = 2;
+ touchesNoires[52] = 3;
+ touchesNoires[53] = 4;
+ touchesNoires[54] = 5;
+ touchesNoires[56] = 6;
+ touchesNoires[57] = 7;
+ touchesNoires[522] = 8;
+ touchesNoires[169] = 8;
+ touchesNoires[61] = 9;
+ touchesNoires[8] = 10;
+}
diff --git a/Processing-js/Draw.pde b/Processing-js/Draw.pde
new file mode 100644
index 0000000..c0fb685
--- /dev/null
+++ b/Processing-js/Draw.pde
@@ -0,0 +1,86 @@
+/* Redéfinition de fonctions pour transformer les coordonnées relatives en coordonnées absolues */
+void drect(float i, float j, float k, float l)
+{
+ rect(i*windowSize[0], j*windowSize[1], k*windowSize[0], l*windowSize[1]);
+}
+
+void dtriangle(float i, float j, float k, float l, float m, float n)
+{
+ triangle(i*windowSize[0], j*windowSize[1], k*windowSize[0], l*windowSize[1], m*windowSize[0], n*windowSize[1]);
+}
+
+void dellipse(float i, float j, float k, float l)
+{
+ ellipse(i*windowSize[0], j*windowSize[1], k*windowSize[0], l*windowSize[0]);
+}
+
+void dtext(String t, float x, float y)
+{
+ text(t, x*windowSize[0], y*windowSize[1]);
+}
+
+void dimage(PImage p, float i, float j, float k, float l)
+{
+ image(p, i*windowSize[0], j*windowSize[1], k*windowSize[0], l*windowSize[1]);
+}
+/* Fin de redéfinition des fonctions */
+
+void drawKeyboard()
+{
+ stroke(0);
+ // Dessine chaque octaves
+ for (int j=0; j<numOctaves; j++) {
+ fill(255);
+ // Dessine les touches blanches
+ for (int i=0; i<7; i++) {
+ if (keysPressed[1][(j*7)+i] != 0) fill(0, 255, 0);
+ drect((keyWidth[1]/numOctaves)*i+(float)j/numOctaves, keyboardYCoordinate, keyWidth[1]/(numOctaves), keyHeight[1]);
+ fill(255,0,255);
+ dtext(nomTouchesBlanches[i+(j*7)], 0.01+(keyWidth[1]/numOctaves)*i+(float)j/numOctaves, 0.962);
+ fill(255);
+ }
+ fill(0);
+ // Dessine les touches noires
+ for (int i=0; i<keyXCoordinates.length; i++) {
+ if (keysPressed[0][(j*5)+i] != 0) fill(255, 255, 0);
+ drect((keyXCoordinates[i]/numOctaves)+(float)j/numOctaves, keyboardYCoordinate, keyWidth[0]/(numOctaves), keyHeight[0]);
+ fill(255,0,255);
+ dtext(nomTouchesNoires[i+(j*5)], 0.01+(keyXCoordinates[i]/numOctaves)+(float)j/numOctaves, keyboardYCoordinate+0.32);
+ fill(0);
+ }
+ }
+}
+
+void drawDisplay() // Dessine l'affichage, appelé lors du lancement et après chaque clic.
+{
+ stroke(0);
+
+ /* Bouton lecture */
+ if (events[MUSICSTARTED]) fill(0, 0, 255); // Colorisation du bouton lecture si activé
+ else fill(255);
+ dellipse(playButtonCoordinates[0], playButtonCoordinates[1], buttonRadius*2, buttonRadius*2); // Contour
+ fill(0);
+ dtriangle(playButtonCoordinates[0]-0.01, playButtonCoordinates[1]-0.02, playButtonCoordinates[0]+0.02, playButtonCoordinates[1], playButtonCoordinates[0]-0.01, playButtonCoordinates[1]+0.02); // Logo lecture
+
+ /* Bouton enregistrer */
+ if(events[MUSICPLAYED])
+ {
+ if (events[RECORDINGSTARTED]) fill(255, 0, 0); // Colorisation du bouton enregistrer si activé
+ else fill(255);
+ dellipse(recordButtonCoordinates[0], recordButtonCoordinates[1], buttonRadius*2, buttonRadius*2); // Contour
+ fill(0);
+ dellipse(recordButtonCoordinates[0], recordButtonCoordinates[1], buttonRadius, buttonRadius); // Logo
+ }
+
+ if (!events[RECORDINGSTARTED] && events[RECORDINGSTOPPED] && score != -1)
+ {
+ fill(255,0,255);
+ dtext("Score :" + Integer.toString(score), 0.86, 0.32); // Affichage du score
+ }
+ else
+ {
+ fill(255);
+ stroke(255);
+ drect(0.85, 0.25, 0.15, 0.10);
+ }
+}
diff --git a/Processing-js/Synth.pde b/Processing-js/Synth.pde
new file mode 100644
index 0000000..19d3a65
--- /dev/null
+++ b/Processing-js/Synth.pde
@@ -0,0 +1,106 @@
+void initSynth()
+{
+// MIDI.loadPlugin({instrument: "acoustic_grand_piano"});
+}
+
+int processNote(int activatedKey, boolean white, boolean on, boolean autoplay) // Détection de la note cliquée
+{
+ int keyNumber;
+ int octave;
+
+ if(autoplay)
+ {
+ if(on)
+ keysPressed[white ? 1 : 0][activatedKey-1] = -1;
+ else
+ keysPressed[white ? 1 : 0][activatedKey-1] = 0;
+ }
+ else if(on && keysPressed[white ? 1 : 0][activatedKey-1] > 0)
+ return -1;
+
+ if (white)
+ {
+ keyNumber = (activatedKey-1)%7;
+ octave = (activatedKey-1-keyNumber)/7;
+ if (keyNumber < 3)
+ keyNumber *= 2;
+ else
+ keyNumber = (keyNumber*2)-1;
+ }
+ else
+ {
+ keyNumber = (activatedKey-1)%5;
+ octave = (activatedKey-1-keyNumber)/5;
+ if (keyNumber < 2)
+ keyNumber = (keyNumber*2)+1;
+ else
+ keyNumber = (keyNumber*2)+2;
+ }
+ octave -= (numOctaves-numOctaves%2)/2;
+ keyNumber = octave*12+baseNote+keyNumber;
+ if(on)
+ {
+ MIDI.noteOn(0, keyNumber, midiVelocity, 0);
+ keysPressed[white ? 1 : 0][activatedKey-1] = 1;
+ }
+ else
+ {
+ MIDI.noteOff(0, keyNumber, 0);
+ keysPressed[white ? 1 : 0][activatedKey-1] = 0;
+ }
+
+ if (on && events[RECORDINGSTARTED])
+ {
+ if(numnote >= notePressed.length)
+ events[RECORDINGSTOPPED] = true;
+ else
+ {
+ notePressed[numnote][0] = keyNumber;
+ if (numnote != 0) notePressed[numnote][1] = millis() - notePressed[0][1];
+ else notePressed[numnote][1] = millis();
+ numnote++;
+ }
+ }
+ return keyNumber;
+}
+
+void playNotes() // Joue les notes de notes[][], appelé lors du clic sur le bouton lecture et jusqu'à la fin du tableau
+{
+
+ if (timer == 0) // Si le chronomètre n'est pas lancé
+ {
+ if (events[PLAYPRESSED]) // Et que la touche lecture est cliquée
+ {
+ timer = millis(); // Lancer le chronomètre
+ events[MUSICSTARTED] = true;
+ if(!events[MUSICPLAYED]) events[MUSICPLAYED] = true;
+ }
+ }
+ else if (numnote < notes.length) // Si la note suivante existe
+ {
+ if ( numnote == 0 || timer + notes[numnote-1][2]*(60000/bpm) < millis() ) // et que c'est la première note ou la durée de la note précédente est écoulée
+ {
+ if(numnote > 0) processNote(notes[numnote-1][0], notes[numnote-1][1]%2!=0, false, true);
+ int keyNumber = processNote(notes[numnote][0], notes[numnote][1]%2!=0, true, true);
+ /* Remplit un tableau temporaire comportant le timestamp de chaque note. */
+ tmpNotes[numnote][0] = keyNumber;
+ if (numnote != 0) tmpNotes[numnote][1] = millis()-tmpNotes[0][1];
+ else tmpNotes[0][1] = millis();
+
+ //channel.noteOn(notes[numnote][0], midiVelocity); // Jouer la note
+ numnote++; // Passer à la note suivante
+ timer = millis(); // Réinitialiser le chronomètre
+ }
+ }
+ else // Si la lecture est terminée
+ {
+ if ( numnote == 0 || timer + notes[numnote-1][2]*(60000/bpm) < millis() ) // et que c'est la première note ou la durée de la note précédente est écoulée
+ {
+ processNote(notes[numnote-1][0], notes[numnote-1][1]%2!=0, false, true);
+ tmpNotes[0][1] = 0; // Le timestamp de la première note est 0.
+ timer = 0;
+ numnote = 0;
+ events[MUSICFINISHED] = true;
+ }
+ }
+}
diff --git a/Processing-js/Synthe3000.pde b/Processing-js/Synthe3000.pde
new file mode 100644
index 0000000..97f205a
--- /dev/null
+++ b/Processing-js/Synthe3000.pde
@@ -0,0 +1,198 @@
+/* @pjs preload="PartitionLune.png"; */
+
+void calcScore()
+{
+ score = 0;
+ float tmpScore = 0;
+ for (int i=0; i<=numnote; i++) // Pour chaque note cliquée
+ {
+ for (int j=0; j < tmpNotes.length; j++) // La comparer à chaque note de la partition
+ {
+ if (notePressed[i][0] != tmpNotes[j][0]) // Si la note est différente
+ continue; // Passer à la note suivante
+ if(i == 0 && j == 0) // Si c'est la toute première note
+ tmpScore = 1; // Donner d'office un score de 1000
+ if(i == 0 || j == 0) // Si on est à la première note d'un des deux tableaux
+ continue; // Passer à la note suivante
+ float deltaTime = sqrt(abs((notePressed[i][1]-notePressed[i-1][1]) - (tmpNotes[j][1]-tmpNotes[j-1][1]))); // Calcul de la différence de durée de la note de la partition et de la note cliquée passé à la racine carrée pour donner un résultat plus adapté
+ if (deltaTime == 0) // Si les notes ont exactement la même durée
+ tmpScore = 1; // Donner un score de 1000
+ else if (1/((float)deltaTime) > tmpScore) // Si le score est le plus élevé pour une note cliquée comparée à plusieurs note de la partition
+ tmpScore = 1/((float)deltaTime); // Enregistrer ce score (l'inverse, puisque que plus la différence de temps est grande, moins le score est important)
+ }
+ score += tmpScore*1000;
+ tmpScore = 0;
+ }
+}
+
+void setup() {
+ PartitionLune = loadImage(imagePartition); // Charge l'image de la partition
+ initSynth();
+ defineKeys();
+ size(1130,650);
+ background(255);
+ PFont myFont = createFont("Boingo", 32);
+ textFont(myFont);
+ drawKeyboard();
+ drawDisplay();
+ dimage(PartitionLune, imageCoordinates[0], imageCoordinates[1], imageSize[0], imageSize[1]);
+}
+
+void draw() {
+
+ if (events[MOUSEPRESSED] || events[KEYPRESSED]) // Si un clic a eu lieu, mettre à jour
+ {
+ playNotes();
+ drawKeyboard();
+ drawDisplay();
+ }
+ else if (events[MUSICSTARTED]) // Ou si la musique est lancée
+ {
+
+ if (events[MUSICFINISHED])
+ {
+ events[MUSICSTARTED] = false;
+ events[MUSICFINISHED] = false;
+ drawDisplay();
+ }
+ else
+ {
+ playNotes();
+ drawKeyboard();
+ }
+ }
+ if (events[RECORDINGSTARTED])
+ {
+ if (events[RECORDINGSTOPPED])
+ {
+ events[RECORDINGSTARTED] = false;
+ notePressed[0][1] = 0;
+ calcScore();
+ numnote = 0;
+ drawDisplay();
+ }
+ }
+ events[MOUSEPRESSED] = false;
+ events[KEYPRESSED] = false;
+ events[PLAYPRESSED] = false;
+}
+
+int whiteKeys() // Détection du clic sur une touche blanche
+{
+ int activatedKey = 0;
+ for (int j=0; j<numOctaves; j++) {
+ for (int i=0; i<7; i++) {
+ float xPos = (keyWidth[1]/numOctaves)*i+(float)j/numOctaves;
+ if ((mouseX >= xPos*windowSize[0]) && (mouseX <= (xPos+(keyWidth[1]/(numOctaves)))*windowSize[0]) && (mouseY <= (keyboardYCoordinate+keyHeight[1])*windowSize[1]))
+ activatedKey = (j*7)+(i+1);
+ }
+ }
+ return activatedKey;
+}
+
+int blackKeys() // Détection du clic sur une touche noire
+{
+ int activatedKey = 0;
+ for (int j=0; j<numOctaves; j++) {
+ // Dessine les touches noires
+ for (int i=0; i<keyXCoordinates.length; i++) {
+ float xPos = (keyXCoordinates[i]/numOctaves)+(float)j/numOctaves;
+ if ((mouseX >= xPos*windowSize[0]) && (mouseX <= (xPos+(keyWidth[0]/(numOctaves)))*windowSize[0]) && (mouseY <= (keyboardYCoordinate+keyHeight[0])*windowSize[1]))
+ activatedKey = (j*5)+(i+1);
+ }
+ }
+ return activatedKey;
+}
+
+void mousePressed() {
+ events[MOUSEPRESSED] = true;
+
+ if (mouseY >= keyboardYCoordinate*windowSize[1]) // Si le clic est effectué au niveau du clavier
+ {
+ int activatedKey = blackKeys();
+
+ if (activatedKey == 0)
+ {
+ activatedKey = whiteKeys();
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, true, false);
+ }
+ else processNote(activatedKey, false, true, false);
+ }
+ else
+ {
+ if (!events[RECORDINGSTARTED] && sqrt(pow((playButtonCoordinates[0]*windowSize[0] - (float)mouseX), 2) + pow((playButtonCoordinates[1]*windowSize[1] - (float)mouseY), 2)) <= buttonRadius*windowSize[0]) // Si une touche d'un chiffre est cliquée (distance entre le centre du cercle et l'endroit cliqué inférieur au rayon)
+ events[PLAYPRESSED] = true;
+ if (!events[MUSICSTARTED] && sqrt(pow((recordButtonCoordinates[0]*windowSize[0] - (float)mouseX), 2) + pow((recordButtonCoordinates[1]*windowSize[1] - (float)mouseY), 2)) <= buttonRadius*windowSize[0]) // Si une touche d'un chiffre est cliquée (distance entre le centre du cercle et l'endroit cliqué inférieur au rayon)
+ {
+ if (events[RECORDINGSTARTED])
+ events[RECORDINGSTOPPED] = true;
+ else if (events[RECORDINGSTOPPED])
+ {
+ events[RECORDINGSTARTED] = true;
+ events[RECORDINGSTOPPED] = false;
+ score = -1;
+ }
+ else
+ events[RECORDINGSTARTED] = true;
+ }
+ }
+}
+
+void mouseReleased()
+{
+ events[MOUSEPRESSED] = true;
+
+ if (mouseY >= keyboardYCoordinate*windowSize[1]) // Si le clic est effectué au niveau du clavier
+ {
+ int activatedKey = blackKeys();
+
+ if (activatedKey == 0)
+ {
+ activatedKey = whiteKeys();
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, false, false);
+ }
+ else processNote(activatedKey, false, false, false);
+ }
+}
+
+void keyPressed() {
+ events[KEYPRESSED] = true;
+
+ if (keyCode < 523)
+ {
+ int activatedKey = touchesNoires[keyCode];
+
+ if (activatedKey == 0)
+ {
+ activatedKey = touchesBlanches[keyCode];
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, true, false);
+ }
+ else processNote(activatedKey, false, true, false);
+ }
+}
+
+void keyReleased()
+{
+ events[KEYPRESSED] = true;
+
+ if (keyCode < 523)
+ {
+ int activatedKey = touchesNoires[keyCode];
+
+ if (activatedKey == 0)
+ {
+ activatedKey = touchesBlanches[keyCode];
+ if (activatedKey == 0)
+ return;
+ processNote(activatedKey, true, false, false);
+ }
+ else processNote(activatedKey, false, false, false);
+ }
+}
+
diff --git a/Processing-js/data/PartitionLune.png b/Processing-js/data/PartitionLune.png
new file mode 100644
index 0000000..e5e5cfe
--- /dev/null
+++ b/Processing-js/data/PartitionLune.png
Binary files differ
diff --git a/Processing-js/libs/inc/Base64.js b/Processing-js/libs/inc/Base64.js
new file mode 100644
index 0000000..7c1ef07
--- /dev/null
+++ b/Processing-js/libs/inc/Base64.js
@@ -0,0 +1,67 @@
+// http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html
+
+// window.atob and window.btoa
+
+(function (window) {
+
+ var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+
+ window.btoa || (window.btoa = function encode64(input) {
+ input = escape(input);
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+ do {
+ chr1 = input.charCodeAt(i++);
+ chr2 = input.charCodeAt(i++);
+ chr3 = input.charCodeAt(i++);
+ enc1 = chr1 >> 2;
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
+ enc4 = chr3 & 63;
+ if (isNaN(chr2)) {
+ enc3 = enc4 = 64;
+ } else if (isNaN(chr3)) {
+ enc4 = 64;
+ }
+ output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+ } while (i < input.length);
+ return output;
+ });
+
+ window.atob || (window.atob = function(input) {
+ var output = "";
+ var chr1, chr2, chr3 = "";
+ var enc1, enc2, enc3, enc4 = "";
+ var i = 0;
+ // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
+ var base64test = /[^A-Za-z0-9\+\/\=]/g;
+ if (base64test.exec(input)) {
+ alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding.");
+ }
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+ do {
+ enc1 = keyStr.indexOf(input.charAt(i++));
+ enc2 = keyStr.indexOf(input.charAt(i++));
+ enc3 = keyStr.indexOf(input.charAt(i++));
+ enc4 = keyStr.indexOf(input.charAt(i++));
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+ output = output + String.fromCharCode(chr1);
+ if (enc3 != 64) {
+ output = output + String.fromCharCode(chr2);
+ }
+ if (enc4 != 64) {
+ output = output + String.fromCharCode(chr3);
+ }
+ chr1 = chr2 = chr3 = "";
+ enc1 = enc2 = enc3 = enc4 = "";
+ } while (i < input.length);
+ return unescape(output);
+ });
+
+}(this)); \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/license.txt b/Processing-js/libs/inc/SoundManager2/license.txt
new file mode 100755
index 0000000..1a17182
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/license.txt
@@ -0,0 +1,29 @@
+Software License Agreement (BSD License)
+
+Copyright (c) 2007, Scott Schiller (schillmania.com)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+
+* Neither the name of schillmania.com nor the names of its contributors may be
+ used to endorse or promote products derived from this software without
+ specific prior written permission from schillmania.com.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/script/soundmanager2-jsmin.js b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-jsmin.js
new file mode 100755
index 0000000..e8b14ae
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-jsmin.js
@@ -0,0 +1,104 @@
+/** @license
+
+
+ SoundManager 2: JavaScript Sound for the Web
+ ----------------------------------------------
+ http://schillmania.com/projects/soundmanager2/
+
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License:
+ http://schillmania.com/projects/soundmanager2/license.txt
+
+ V2.97a.20111220
+*/
+(function(G){function W(W,la){function l(b){return function(a){var d=this._t;return!d||!d._a?(d&&d.sID?c._wD(k+"ignoring "+a.type+": "+d.sID):c._wD(k+"ignoring "+a.type),null):b.call(this,a)}}this.flashVersion=8;this.debugMode=!0;this.debugFlash=!1;this.consoleOnly=this.useConsole=!0;this.waitForWindowLoad=!1;this.bgColor="#ffffff";this.useHighPerformance=!1;this.html5PollingInterval=this.flashPollingInterval=null;this.flashLoadTimeout=1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock=
+!1;this.useHTML5Audio=!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=!0;this.noSWFCache=!1;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};
+this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,
+duration:null};this.movieID="sm2-container";this.id=la||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20111220";this.movieURL=this.version=null;this.url=W||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,
+movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};var ma;try{ma="undefined"!==typeof Audio&&"undefined"!==typeof(new Audio).canPlayType}catch(fb){ma=!1}this.hasHTML5=ma;this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=
+!1;var Ea,c=this,i=null,k="HTML5::",u,p=navigator.userAgent,j=G,O=j.location.href.toString(),h=document,na,X,m,B=[],oa=!0,w,P=!1,Q=!1,n=!1,y=!1,Y=!1,o,Za=0,R,v,pa,H,I,Z,Fa,qa,E,$,aa,J,ra,sa,ba,ca,K,Ga,ta,$a=["log","info","warn","error"],Ha,da,Ia,S=null,ua=null,q,va,L,Ja,ea,fa,wa,s,ga=!1,xa=!1,Ka,La,Ma,ha=0,T=null,ia,z=null,Na,ja,U,C,ya,za,Oa,r,Pa=Array.prototype.slice,F=!1,t,ka,Qa,A,Ra,Aa=p.match(/(ipad|iphone|ipod)/i),ab=p.match(/firefox/i),bb=p.match(/droid/i),D=p.match(/msie/i),cb=p.match(/webkit/i),
+V=p.match(/safari/i)&&!p.match(/chrome/i),db=p.match(/opera/i),Ba=p.match(/(mobile|pre\/|xoom)/i)||Aa,Ca=!O.match(/usehtml5audio/i)&&!O.match(/sm2\-ignorebadua/i)&&V&&!p.match(/silk/i)&&p.match(/OS X 10_6_([3-7])/i),Sa="undefined"!==typeof console&&"undefined"!==typeof console.log,Da="undefined"!==typeof h.hasFocus?h.hasFocus():null,M=V&&"undefined"===typeof h.hasFocus,Ta=!M,Ua=/(mp3|mp4|mpa)/i,N=h.location?h.location.protocol.match(/http/i):null,Va=!N?"http://":"",Wa=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i,
+Xa="mpeg4,aac,flv,mov,mp4,m4v,f4v,m4a,mp4v,3gp,3g2".split(","),eb=RegExp("\\.("+Xa.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!N;this._global_a=null;if(Ba&&(c.useHTML5Audio=!0,c.preferFlash=!1,Aa))F=c.ignoreFlash=!0;this.supported=this.ok=function(){return z?n&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return u(c)||h[c]||j[c]};this.createSound=function(b){function a(){f=ea(f);c.sounds[e.id]=new Ea(e);c.soundIDs.push(e.id);
+return c.sounds[e.id]}var d,f=null,e=d=null;d="soundManager.createSound(): "+q(!n?"notReady":"notOK");if(!n||!c.ok())return wa(d),!1;2===arguments.length&&(b={id:arguments[0],url:arguments[1]});f=v(b);f.url=ia(f.url);e=f;e.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+q("badID",e.id),2);c._wD("soundManager.createSound(): "+e.id+" ("+e.url+")",1);if(s(e.id,!0))return c._wD("soundManager.createSound(): "+e.id+" exists",1),c.sounds[e.id];if(ja(e))d=a(),c._wD("Loading sound "+
+e.id+" via HTML5"),d._setup_html5(e);else{if(8<m){if(null===e.isMovieStar)e.isMovieStar=e.serverURL||(e.type?e.type.match(Wa):!1)||e.url.match(eb);e.isMovieStar&&c._wD("soundManager.createSound(): using MovieStar handling");if(e.isMovieStar){if(e.usePeakData)o("noPeak"),e.usePeakData=!1;1<e.loops&&o("noNSLoop")}}e=fa(e,"soundManager.createSound(): ");d=a();if(8===m)i._createSound(e.id,e.loops||1,e.usePolicyFile);else if(i._createSound(e.id,e.url,e.usePeakData,e.useWaveformData,e.useEQData,e.isMovieStar,
+e.isMovieStar?e.bufferTime:!1,e.loops||1,e.serverURL,e.duration||null,e.autoPlay,!0,e.autoLoad,e.usePolicyFile),!e.serverURL)d.connected=!0,e.onconnect&&e.onconnect.apply(d);!e.serverURL&&(e.autoLoad||e.autoPlay)&&d.load(e)}!e.serverURL&&e.autoPlay&&d.play();return d};this.destroySound=function(b,a){if(!s(b))return!1;var d=c.sounds[b],f;d._iO={};d.stop();d.unload();for(f=0;f<c.soundIDs.length;f++)if(c.soundIDs[f]===b){c.soundIDs.splice(f,1);break}a||d.destruct(!0);delete c.sounds[b];return!0};this.load=
+function(b,a){return!s(b)?!1:c.sounds[b].load(a)};this.unload=function(b){return!s(b)?!1:c.sounds[b].unload()};this.onposition=this.onPosition=function(b,a,d,f){return!s(b)?!1:c.sounds[b].onposition(a,d,f)};this.clearOnPosition=function(b,a,d){return!s(b)?!1:c.sounds[b].clearOnPosition(a,d)};this.start=this.play=function(b,a){if(!n||!c.ok())return wa("soundManager.play(): "+q(!n?"notReady":"notOK")),!1;if(!s(b)){a instanceof Object||(a={url:a});return a&&a.url?(c._wD('soundManager.play(): attempting to create "'+
+b+'"',1),a.id=b,c.createSound(a).play()):!1}return c.sounds[b].play(a)};this.setPosition=function(b,a){return!s(b)?!1:c.sounds[b].setPosition(a)};this.stop=function(b){if(!s(b))return!1;c._wD("soundManager.stop("+b+")",1);return c.sounds[b].stop()};this.stopAll=function(){var b;c._wD("soundManager.stopAll()",1);for(b in c.sounds)c.sounds.hasOwnProperty(b)&&c.sounds[b].stop()};this.pause=function(b){return!s(b)?!1:c.sounds[b].pause()};this.pauseAll=function(){var b;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].pause()};
+this.resume=function(b){return!s(b)?!1:c.sounds[b].resume()};this.resumeAll=function(){var b;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].resume()};this.togglePause=function(b){return!s(b)?!1:c.sounds[b].togglePause()};this.setPan=function(b,a){return!s(b)?!1:c.sounds[b].setPan(a)};this.setVolume=function(b,a){return!s(b)?!1:c.sounds[b].setVolume(a)};this.mute=function(b){var a=0;"string"!==typeof b&&(b=null);if(b){if(!s(b))return!1;c._wD('soundManager.mute(): Muting "'+b+'"');return c.sounds[b].mute()}c._wD("soundManager.mute(): Muting all sounds");
+for(a=c.soundIDs.length;a--;)c.sounds[c.soundIDs[a]].mute();return c.muted=!0};this.muteAll=function(){c.mute()};this.unmute=function(b){"string"!==typeof b&&(b=null);if(b){if(!s(b))return!1;c._wD('soundManager.unmute(): Unmuting "'+b+'"');return c.sounds[b].unmute()}c._wD("soundManager.unmute(): Unmuting all sounds");for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].unmute();c.muted=!1;return!0};this.unmuteAll=function(){c.unmute()};this.toggleMute=function(b){return!s(b)?!1:c.sounds[b].toggleMute()};
+this.getMemoryUse=function(){var c=0;i&&8!==m&&(c=parseInt(i._getMemoryUse(),10));return c};this.disable=function(b){var a;"undefined"===typeof b&&(b=!1);if(y)return!1;y=!0;o("shutdown",1);for(a=c.soundIDs.length;a--;)Ha(c.sounds[c.soundIDs[a]]);R(b);r.remove(j,"load",I);return!0};this.canPlayMIME=function(b){var a;c.hasHTML5&&(a=U({type:b}));return!z||a?a:b?!!(8<m&&b.match(Wa)||b.match(c.mimePattern)):null};this.canPlayURL=function(b){var a;c.hasHTML5&&(a=U({url:b}));return!z||a?a:b?!!b.match(c.filePattern):
+null};this.canPlayLink=function(b){return"undefined"!==typeof b.type&&b.type&&c.canPlayMIME(b.type)?!0:c.canPlayURL(b.href)};this.getSoundById=function(b,a){if(!b)throw Error("soundManager.getSoundById(): sID is null/undefined");var d=c.sounds[b];!d&&!a&&c._wD('"'+b+'" is an invalid sound ID.',2);return d};this.onready=function(b,a){if(b&&b instanceof Function)return n&&c._wD(q("queue","onready")),a||(a=j),pa("onready",b,a),H(),!0;throw q("needFunction","onready");};this.ontimeout=function(b,a){if(b&&
+b instanceof Function)return n&&c._wD(q("queue","ontimeout")),a||(a=j),pa("ontimeout",b,a),H({type:"ontimeout"}),!0;throw q("needFunction","ontimeout");};this._wD=this._writeDebug=function(b,a,d){var f,e;if(!c.debugMode)return!1;"undefined"!==typeof d&&d&&(b=b+" | "+(new Date).getTime());if(Sa&&c.useConsole){d=$a[a];if("undefined"!==typeof console[d])console[d](b);else console.log(b);if(c.consoleOnly)return!0}try{f=u("soundmanager-debug");if(!f)return!1;e=h.createElement("div");if(0===++Za%2)e.className=
+"sm2-alt";a="undefined"===typeof a?0:parseInt(a,10);e.appendChild(h.createTextNode(b));if(a){if(2<=a)e.style.fontWeight="bold";if(3===a)e.style.color="#ff3333"}f.insertBefore(e,f.firstChild)}catch(i){}return!0};this._debug=function(){var b,a;o("currentObj",1);for(b=0,a=c.soundIDs.length;b<a;b++)c.sounds[c.soundIDs[b]]._debug()};this.reboot=function(){c._wD("soundManager.reboot()");c.soundIDs.length&&c._wD("Destroying "+c.soundIDs.length+" SMSound objects...");var b,a;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].destruct();
+try{if(D)ua=i.innerHTML;S=i.parentNode.removeChild(i);c._wD("Flash movie removed.")}catch(d){o("badRemove",2)}ua=S=z=null;c.enabled=sa=n=ga=xa=P=Q=y=c.swfLoaded=!1;c.soundIDs=c.sounds=[];i=null;for(b in B)if(B.hasOwnProperty(b))for(a=B[b].length;a--;)B[b][a].fired=!1;c._wD("soundManager: Rebooting...");j.setTimeout(c.beginDelayedInit,20)};this.getMoviePercent=function(){return i&&"undefined"!==typeof i.PercentLoaded?i.PercentLoaded():null};this.beginDelayedInit=function(){Y=!0;J();setTimeout(function(){if(xa)return!1;
+ca();aa();return xa=!0},20);Z()};this.destruct=function(){c._wD("soundManager.destruct()");c.disable(!0)};Ea=function(b){var a=this,d,f,e,h,g,Ya,j=!1,x=[],l=0,n,r,p=null,t=null,u=null;this.sID=b.id;this.url=b.url;this._iO=this.instanceOptions=this.options=v(b);this.pan=this.options.pan;this.volume=this.options.volume;this.isHTML5=!1;this._a=null;this.id3={};this._debug=function(){if(c.debugMode){var b=null,e=[],d,f;for(b in a.options)null!==a.options[b]&&(a.options[b]instanceof Function?(d=a.options[b].toString(),
+d=d.replace(/\s\s+/g," "),f=d.indexOf("{"),e.push(" "+b+": {"+d.substr(f+1,Math.min(Math.max(d.indexOf("\n")-1,64),64)).replace(/\n/g,"")+"... }")):e.push(" "+b+": "+a.options[b]));c._wD("SMSound() merged options: {\n"+e.join(", \n")+"\n}")}};this._debug();this.load=function(b){var d=null;if("undefined"!==typeof b)a._iO=v(b,a.options),a.instanceOptions=a._iO;else if(b=a.options,a._iO=b,a.instanceOptions=a._iO,p&&p!==a.url)o("manURL"),a._iO.url=a.url,a.url=null;if(!a._iO.url)a._iO.url=a.url;a._iO.url=
+ia(a._iO.url);c._wD("SMSound.load(): "+a._iO.url,1);if(a._iO.url===a.url&&0!==a.readyState&&2!==a.readyState)return o("onURL",1),3===a.readyState&&a._iO.onload&&a._iO.onload.apply(a,[!!a.duration]),a;b=a._iO;p=a.url;a.loaded=!1;a.readyState=1;a.playState=0;if(ja(b))d=a._setup_html5(b),d._called_load?c._wD(k+"ignoring request to load again: "+a.sID):(c._wD(k+"load: "+a.sID),a._html5_canplay=!1,a._a.autobuffer="auto",a._a.preload="auto",d.load(),d._called_load=!0,b.autoPlay&&a.play());else try{a.isHTML5=
+!1,a._iO=fa(ea(b)),b=a._iO,8===m?i._load(a.sID,b.url,b.stream,b.autoPlay,b.whileloading?1:0,b.loops||1,b.usePolicyFile):i._load(a.sID,b.url,!!b.stream,!!b.autoPlay,b.loops||1,!!b.autoLoad,b.usePolicyFile)}catch(e){o("smError",2),w("onload",!1),K({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}return a};this.unload=function(){0!==a.readyState&&(c._wD('SMSound.unload(): "'+a.sID+'"'),a.isHTML5?(h(),a._a&&(a._a.pause(),ya(a._a))):8===m?i._unload(a.sID,"about:blank"):i._unload(a.sID),d());return a};this.destruct=
+function(b){c._wD('SMSound.destruct(): "'+a.sID+'"');if(a.isHTML5){if(h(),a._a)a._a.pause(),ya(a._a),F||e(),a._a._t=null,a._a=null}else a._iO.onfailure=null,i._destroySound(a.sID);b||c.destroySound(a.sID,!0)};this.start=this.play=function(b,d){var e,d=void 0===d?!0:d;b||(b={});a._iO=v(b,a._iO);a._iO=v(a._iO,a.options);a._iO.url=ia(a._iO.url);a.instanceOptions=a._iO;if(a._iO.serverURL&&!a.connected)return a.getAutoPlay()||(c._wD("SMSound.play(): Netstream not connected yet - setting autoPlay"),a.setAutoPlay(!0)),
+a;ja(a._iO)&&(a._setup_html5(a._iO),g());if(1===a.playState&&!a.paused)if(e=a._iO.multiShot)c._wD('SMSound.play(): "'+a.sID+'" already playing (multi-shot)',1);else return c._wD('SMSound.play(): "'+a.sID+'" already playing (one-shot)',1),a;if(a.loaded)c._wD('SMSound.play(): "'+a.sID+'"');else if(0===a.readyState){c._wD('SMSound.play(): Attempting to load "'+a.sID+'"',1);if(!a.isHTML5)a._iO.autoPlay=!0;a.load(a._iO)}else{if(2===a.readyState)return c._wD('SMSound.play(): Could not load "'+a.sID+'" - exiting',
+2),a;c._wD('SMSound.play(): "'+a.sID+'" is loading - attempting to play..',1)}if(!a.isHTML5&&9===m&&0<a.position&&a.position===a.duration)c._wD('SMSound.play(): "'+a.sID+'": Sound at end, resetting to position:0'),b.position=0;if(a.paused&&a.position&&0<a.position)c._wD('SMSound.play(): "'+a.sID+'" is resuming from paused state',1),a.resume();else{a._iO=v(b,a._iO);if(null!==a._iO.from&&null!==a._iO.to&&0===a.instanceCount&&0===a.playState&&!a._iO.serverURL){e=function(){a._iO=v(b,a._iO);a.play(a._iO)};
+if(a.isHTML5&&!a._html5_canplay)return c._wD('SMSound.play(): Beginning load of "'+a.sID+'" for from/to case'),a.load({_oncanplay:e}),!1;if(!a.isHTML5&&!a.loaded&&(!a.readyState||2!==a.readyState))return c._wD('SMSound.play(): Preloading "'+a.sID+'" for from/to case'),a.load({onload:e}),!1;a._iO=r()}c._wD('SMSound.play(): "'+a.sID+'" is starting to play');(!a.instanceCount||a._iO.multiShotEvents||!a.isHTML5&&8<m&&!a.getAutoPlay())&&a.instanceCount++;0===a.playState&&a._iO.onposition&&Ya(a);a.playState=
+1;a.paused=!1;a.position="undefined"!==typeof a._iO.position&&!isNaN(a._iO.position)?a._iO.position:0;if(!a.isHTML5)a._iO=fa(ea(a._iO));a._iO.onplay&&d&&(a._iO.onplay.apply(a),j=!0);a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?(g(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):i._start(a.sID,a._iO.loops||1,9===m?a._iO.position:a._iO.position/1E3)}return a};this.stop=function(c){var b=a._iO;if(1===a.playState){a._onbufferchange(0);a._resetOnPosition(0);a.paused=!1;if(!a.isHTML5)a.playState=
+0;n();b.to&&a.clearOnPosition(b.to);if(a.isHTML5){if(a._a)c=a.position,a.setPosition(0),a.position=c,a._a.pause(),a.playState=0,a._onTimer(),h()}else i._stop(a.sID,c),b.serverURL&&a.unload();a.instanceCount=0;a._iO={};b.onstop&&b.onstop.apply(a)}return a};this.setAutoPlay=function(b){c._wD("sound "+a.sID+" turned autoplay "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(i._setAutoPlay(a.sID,b),b&&!a.instanceCount&&1===a.readyState&&(a.instanceCount++,c._wD("sound "+a.sID+" incremented instance count to "+
+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){void 0===b&&(b=0);var d=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a)if(a._html5_canplay){if(a._a.currentTime!==b){c._wD("setPosition("+b+"): setting position");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD("setPosition("+b+"): setting position failed: "+
+e.message,2)}}}else c._wD("setPosition("+b+"): delaying, sound not ready")}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&i._setPosition(a.sID,b,a.paused||!a.playState);a.isHTML5&&a.paused&&a._onTimer(!0);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD("SMSound.pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),h()):(b||void 0===b)&&i._pause(a.sID);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;
+c._wD("SMSound.resume()");a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),g()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),i._pause(a.sID));j&&b.onplay?(b.onplay.apply(a),j=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD("SMSound.togglePause()");if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){"undefined"===typeof b&&(b=0);"undefined"===
+typeof c&&(c=!1);a.isHTML5||i._setPan(a.sID,b);a._iO.pan=b;if(!c)a.pan=b,a.options.pan=b;return a};this.setVolume=function(b,d){"undefined"===typeof b&&(b=100);"undefined"===typeof d&&(d=!1);if(a.isHTML5){if(a._a)a._a.volume=Math.max(0,Math.min(1,b/100))}else i._setVolume(a.sID,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;if(!d)a.volume=b,a.options.volume=b;return a};this.mute=function(){a.muted=!0;if(a.isHTML5){if(a._a)a._a.muted=!0}else i._setVolume(a.sID,0);return a};this.unmute=function(){a.muted=
+!1;var b="undefined"!==typeof a._iO.volume;if(a.isHTML5){if(a._a)a._a.muted=!1}else i._setVolume(a.sID,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){x.push({position:b,method:c,scope:"undefined"!==typeof d?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c,a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c<x.length;c++)if(a===x[c].position&&(!b||b===x[c].method))x[c].fired&&l--,
+x.splice(c,1)};this._processOnPosition=function(){var b,c;b=x.length;if(!b||!a.playState||l>=b)return!1;for(;b--;)if(c=x[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=x.length;if(!b)return!1;for(;b--;)if(c=x[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};r=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.sID+': "to" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.sID+
+': playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};if(null!==d&&!isNaN(d))b.position=d,b.multiShot=!1,f();return b};Ya=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};g=function(){a.isHTML5&&Ka(a)};h=function(){a.isHTML5&&La(a)};d=function(){x=[];l=0;j=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=
+null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};d();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0<a.playState||1===a.readyState)&&!a.paused)){c=a._get_html5_duration();
+if(c!==t)t=c,a.duration=c,d=!0;a.durationEstimate=a.duration;c=1E3*a._a.currentTime||0;c!==u&&(u=c,d=!0);(d||b)&&a._whileplaying(c,e,e,e,e);return d}return!1}};this._get_html5_duration=function(){var b=a._iO,c=a._a?1E3*a._a.duration:b?b.duration:void 0;return c&&!isNaN(c)&&Infinity!==c?c:b?b.duration:null};this._setup_html5=function(b){var b=v(a._iO,b),e=decodeURI,g=F?c._global_a:a._a,h=e(b.url),i=g&&g._t?g._t.instanceOptions:null;if(g){if(g._t&&(!F&&h===e(p)||F&&i.url===b.url&&(!p||p===i.url)))return g;
+c._wD("setting new URL on existing object: "+h+(p?", old URL: "+p:""));F&&g._t&&g._t.playState&&b.url!==i.url&&g._t.stop();d();g.src=b.url;p=a.url=b.url;g._called_load=!1}else{c._wD("creating HTML5 Audio() element with URL: "+h);g=new Audio(b.url);g._called_load=!1;if(bb)g._called_load=!0;if(F)c._global_a=g}a.isHTML5=!0;a._a=g;g._t=a;f();g.loop=1<b.loops?"loop":"";b.autoLoad||b.autoPlay?a.load():(g.autobuffer=!1,g.preload="none");g.loop=1<b.loops?"loop":"";return g};f=function(){if(a._a._added_events)return!1;
+var b;c._wD(k+"adding event listeners: "+a.sID);a._a._added_events=!0;for(b in A)A.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,A[b],!1);return!0};e=function(){var b;c._wD(k+"removing event listeners: "+a.sID);a._a._added_events=!1;for(b in A)A.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,A[b],!1)};this._onload=function(b){var d,b=!!b;c._wD(d+'"'+a.sID+'"'+(b?" loaded.":" failed to load? - "+a.url),b?1:2);d="SMSound._onload(): ";!b&&!a.isHTML5&&(!0===c.sandbox.noRemote&&c._wD(d+q("noNet"),
+1),!0===c.sandbox.noLocal&&c._wD(d+q("noLocal"),1));a.loaded=b;a.readyState=b?3:2;a._onbufferchange(0);a._iO.onload&&a._iO.onload.apply(a,[b]);return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD("SMSound._onbufferchange(): "+b),a._iO.onbufferchange.apply(a));return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD("SMSound._onsuspend()"),a._iO.onsuspend.apply(a));return!0};this._onfailure=
+function(b,d,e){a.failures++;c._wD('SMSound._onfailure(): "'+a.sID+'" count '+a.failures);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,d,e);else c._wD("SMSound._onfailure(): ignoring")};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount){a.instanceCount--;if(!a.instanceCount)n(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},h();if((!a.instanceCount||a._iO.multiShotEvents)&&b)c._wD('SMSound._onfinish(): "'+
+a.sID+'"'),b.apply(a)}};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;if(f.isMovieStar)a.durationEstimate=a.duration;else if(a.durationEstimate=f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||
+null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8<m){if(g.usePeakData&&"undefined"!==typeof c&&c)a.peakData={left:c.leftPeak,right:c.rightPeak};if(g.useWaveformData&&"undefined"!==typeof d&&d)a.waveformData={left:d.split(","),right:e.split(",")};if(g.useEQData&&"undefined"!==typeof f&&f&&f.leftEQ&&(b=f.leftEQ.split(","),a.eqData=b,a.eqData.left=b,"undefined"!==typeof f.rightEQ&&f.rightEQ))a.eqData.right=f.rightEQ.split(",")}1===a.playState&&(!a.isHTML5&&8===m&&!a.position&&a.isBuffering&&
+a._onbufferchange(0),g.whileplaying&&g.whileplaying.apply(a));return!0};this._onmetadata=function(b,d){c._wD('SMSound._onmetadata(): "'+this.sID+'" metadata received.');var e={},f,g;for(f=0,g=b.length;f<g;f++)e[b[f]]=d[f];a.metadata=e;a._iO.onmetadata&&a._iO.onmetadata.apply(a)};this._onid3=function(b,d){c._wD('SMSound._onid3(): "'+this.sID+'" ID3 data received.');var e=[],f,g;for(f=0,g=b.length;f<g;f++)e[b[f]]=d[f];a.id3=v(a.id3,e);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=
+1===b;c._wD('SMSound._onconnect(): "'+a.sID+'"'+(b?" connected.":" failed to connect? - "+a.url),b?1:2);if(a.connected=b)a.failures=0,s(a.sID)&&(a.getAutoPlay()?a.play(void 0,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=function(b){0<a.playState&&(c._wD("SMSound._ondataerror(): "+b),a._iO.ondataerror&&a._iO.ondataerror.apply(a))}};ba=function(){return h.body||h._docElement||h.getElementsByTagName("div")[0]};u=function(b){return h.getElementById(b)};
+v=function(b,a){var d={},f,e;for(f in b)b.hasOwnProperty(f)&&(d[f]=b[f]);f="undefined"===typeof a?c.defaultOptions:a;for(e in f)f.hasOwnProperty(e)&&"undefined"===typeof d[e]&&(d[e]=f[e]);return d};r=function(){function b(a){var a=Pa.call(a),b=a.length;c?(a[1]="on"+a[1],3<b&&a.pop()):3===b&&a.push(!1);return a}function a(a,b){var g=a.shift(),h=[f[b]];if(c)g[h](a[0],a[1]);else g[h].apply(g,a)}var c=j.attachEvent,f={add:c?"attachEvent":"addEventListener",remove:c?"detachEvent":"removeEventListener"};
+return{add:function(){a(b(arguments),"add")},remove:function(){a(b(arguments),"remove")}}}();A={abort:l(function(){c._wD(k+"abort: "+this._t.sID)}),canplay:l(function(){var b=this._t;if(b._html5_canplay)return!0;b._html5_canplay=!0;c._wD(k+"canplay: "+b.sID+", "+b.url);b._onbufferchange(0);var a=!isNaN(b.position)?b.position/1E3:null;if(b.position&&this.currentTime!==a){c._wD(k+"canplay: setting position to "+a);try{this.currentTime=a}catch(d){c._wD(k+"setting position failed: "+d.message,2)}}b._iO._oncanplay&&
+b._iO._oncanplay()}),load:l(function(){var b=this._t;b.loaded||(b._onbufferchange(0),b._whileloading(b.bytesTotal,b.bytesTotal,b._get_html5_duration()),b._onload(!0))}),emptied:l(function(){c._wD(k+"emptied: "+this._t.sID)}),ended:l(function(){var b=this._t;c._wD(k+"ended: "+b.sID);b._onfinish()}),error:l(function(){c._wD(k+"error: "+this.error.code);this._t._onload(!1)}),loadeddata:l(function(){var b=this._t,a=b.bytesTotal||1;c._wD(k+"loadeddata: "+this._t.sID);if(!b._loaded&&!V)b.duration=b._get_html5_duration(),
+b._whileloading(a,a,b._get_html5_duration()),b._onload(!0)}),loadedmetadata:l(function(){c._wD(k+"loadedmetadata: "+this._t.sID)}),loadstart:l(function(){c._wD(k+"loadstart: "+this._t.sID);this._t._onbufferchange(1)}),play:l(function(){c._wD(k+"play: "+this._t.sID+", "+this._t.url);this._t._onbufferchange(0)}),playing:l(function(){c._wD(k+"playing: "+this._t.sID);this._t._onbufferchange(0)}),progress:l(function(b){var a=this._t;if(a.loaded)return!1;var d,f,e;e=0;var h="progress"===b.type;f=b.target.buffered;
+var g=b.loaded||0,i=b.total||1;if(f&&f.length){for(d=f.length;d--;)e=f.end(d)-f.start(d);g=e/b.target.duration;if(h&&1<f.length){e=[];f=f.length;for(d=0;d<f;d++)e.push(b.target.buffered.start(d)+"-"+b.target.buffered.end(d));c._wD(k+"progress: timeRanges: "+e.join(", "))}h&&!isNaN(g)&&c._wD(k+"progress: "+a.sID+": "+Math.floor(100*g)+"% loaded")}isNaN(g)||(a._onbufferchange(0),a._whileloading(g,i,a._get_html5_duration()),g&&i&&g===i&&A.load.call(this,b))}),ratechange:l(function(){c._wD(k+"ratechange: "+
+this._t.sID)}),suspend:l(function(b){var a=this._t;c._wD(k+"suspend: "+a.sID);A.progress.call(this,b);a._onsuspend()}),stalled:l(function(){c._wD(k+"stalled: "+this._t.sID)}),timeupdate:l(function(){this._t._onTimer()}),waiting:l(function(){var b=this._t;c._wD(k+"waiting: "+b.sID);b._onbufferchange(1)})};ja=function(b){return!b.serverURL&&(b.type?U({type:b.type}):U({url:b.url})||c.html5Only)};ya=function(b){if(b)b.src=ab?"":"about:blank"};U=function(b){function a(a){return c.preferFlash&&t&&!c.ignoreFlash&&
+"undefined"!==typeof c.flash[a]&&c.flash[a]}if(!c.useHTML5Audio||!c.hasHTML5)return!1;var d=b.url||null,b=b.type||null,f=c.audioFormats,e;if(b&&"undefined"!==c.html5[b])return c.html5[b]&&!a(b);if(!C){C=[];for(e in f)f.hasOwnProperty(e)&&(C.push(e),f[e].related&&(C=C.concat(f[e].related)));C=RegExp("\\.("+C.join("|")+")(\\?.*)?$","i")}e=d?d.toLowerCase().match(C):null;if(!e||!e.length)if(b)d=b.indexOf(";"),e=(-1!==d?b.substr(0,d):b).substr(6);else return!1;else e=e[1];if(e&&"undefined"!==typeof c.html5[e])return c.html5[e]&&
+!a(e);b="audio/"+e;d=c.html5.canPlayType({type:b});return(c.html5[e]=d)&&c.html5[b]&&!a(b)};Oa=function(){function b(b){var d,e,f=!1;if(!a||"function"!==typeof a.canPlayType)return!1;if(b instanceof Array){for(d=0,e=b.length;d<e&&!f;d++)if(c.html5[b[d]]||a.canPlayType(b[d]).match(c.html5Test))f=!0,c.html5[b[d]]=!0,c.flash[b[d]]=!(!c.preferFlash||!t||!b[d].match(Ua));return f}b=a&&"function"===typeof a.canPlayType?a.canPlayType(b):!1;return!(!b||!b.match(c.html5Test))}if(!c.useHTML5Audio||"undefined"===
+typeof Audio)return!1;var a="undefined"!==typeof Audio?db?new Audio(null):new Audio:null,d,f={},e,h;e=c.audioFormats;for(d in e)if(e.hasOwnProperty(d)&&(f[d]=b(e[d].type),f["audio/"+d]=f[d],c.flash[d]=c.preferFlash&&!c.ignoreFlash&&d.match(Ua)?!0:!1,e[d]&&e[d].related))for(h=e[d].related.length;h--;)f["audio/"+e[d].related[h]]=f[d],c.html5[e[d].related[h]]=f[d],c.flash[e[d].related[h]]=f[d];f.canPlayType=a?b:null;c.html5=v(c.html5,f);return!0};$={notReady:"Not loaded yet - wait for soundManager.onload()/onready()",
+notOK:"Audio support is not available.",domError:"soundManager::createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.",spcWmode:"soundManager::createMovie(): Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash = true for more security details (output goes to SWF.)",checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+h.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/",
+waitFocus:"soundManager: Special case: Waiting for focus-related event..",waitImpatient:"soundManager: Getting impatient, still waiting for Flash%s...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",needFunction:"soundManager: Function object expected for %s",badID:'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"--- soundManager._debug(): Current sound objects ---",waitEI:"soundManager::initMovie(): Waiting for ExternalInterface call from Flash..",
+waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded",onload:"soundManager::initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",init:"soundManager::init()",didInit:"soundManager::init(): Already called?",flashJS:"soundManager: Attempting to call Flash from JS..",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",
+badRemove:"Warning: Failed to remove flash movie.",noPeak:"Warning: peakData features unsupported for movieStar formats",shutdown:"soundManager.disable(): Shutting down",queue:"soundManager: Queueing %s handler",smFail:"soundManager: Failed to initialise.",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS..",fbLoaded:"Flash loaded",fbHandler:"soundManager::flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",
+onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)",noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case",mfOn:"mobileFlash::enabling on-screen flash repositioning",policy:"Enabling usePolicyFile for data access"};
+q=function(){var b=Pa.call(arguments),a=b.shift(),a=$&&$[a]?$[a]:"",c,f;if(a&&b&&b.length)for(c=0,f=b.length;c<f;c++)a=a.replace("%s",b[c]);return a};ea=function(b){if(8===m&&1<b.loops&&b.stream)o("as2loop"),b.stream=!1;return b};fa=function(b,a){if(b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData))c._wD((a||"")+q("policy")),b.usePolicyFile=!0;return b};wa=function(b){"undefined"!==typeof console&&"undefined"!==typeof console.warn?console.warn(b):c._wD(b)};na=function(){return!1};
+Ha=function(b){for(var a in b)b.hasOwnProperty(a)&&"function"===typeof b[a]&&(b[a]=na)};da=function(b){"undefined"===typeof b&&(b=!1);if(y||b)o("smFail",2),c.disable(b)};Ia=function(b){var a=null;if(b)if(b.match(/\.swf(\?.*)?$/i)){if(a=b.substr(b.toLowerCase().lastIndexOf(".swf?")+4))return b}else b.lastIndexOf("/")!==b.length-1&&(b+="/");b=(b&&-1!==b.lastIndexOf("/")?b.substr(0,b.lastIndexOf("/")+1):"./")+c.movieURL;c.noSWFCache&&(b+="?ts="+(new Date).getTime());return b};qa=function(){m=parseInt(c.flashVersion,
+10);if(8!==m&&9!==m)c._wD(q("badFV",m,8)),c.flashVersion=m=8;var b=c.debugMode||c.debugFlash?"_debug.swf":".swf";if(c.useHTML5Audio&&!c.html5Only&&c.audioFormats.mp4.required&&9>m)c._wD(q("needfl9")),c.flashVersion=m=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8<m?(c.defaultOptions=v(c.defaultOptions,c.flash9Options),c.features.buffering=!0,c.defaultOptions=v(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=RegExp("\\.(mp3|"+Xa.join("|")+
+")(\\?.*)?$","i"),c.features.movieStar=!0):c.features.movieStar=!1;c.filePattern=c.filePatterns[8!==m?"flash9":"flash8"];c.movieURL=(8===m?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",b);c.features.peakData=c.features.waveformData=c.features.eqData=8<m};Ga=function(b,a){if(!i)return!1;i._setPolling(b,a)};ta=function(){if(c.debugURLParam.test(O))c.debugMode=!0;if(u(c.debugID))return!1;var b,a,d,f;if(c.debugMode&&!u(c.debugID)&&(!Sa||!c.useConsole||!c.consoleOnly)){b=h.createElement("div");
+b.id=c.debugID+"-toggle";a={position:"fixed",bottom:"0px",right:"0px",width:"1.2em",height:"1.2em",lineHeight:"1.2em",margin:"2px",textAlign:"center",border:"1px solid #999",cursor:"pointer",background:"#fff",color:"#333",zIndex:10001};b.appendChild(h.createTextNode("-"));b.onclick=Ja;b.title="Toggle SM2 debug console";if(p.match(/msie 6/i))b.style.position="absolute",b.style.cursor="hand";for(f in a)a.hasOwnProperty(f)&&(b.style[f]=a[f]);a=h.createElement("div");a.id=c.debugID;a.style.display=c.debugMode?
+"block":"none";if(c.debugMode&&!u(b.id)){try{d=ba(),d.appendChild(b)}catch(e){throw Error(q("domError")+" \n"+e.toString());}d.appendChild(a)}}};s=this.getSoundById;o=function(b,a){return b?c._wD(q(b),a):""};if(O.indexOf("sm2-debug=alert")+1&&c.debugMode)c._wD=function(b){G.alert(b)};Ja=function(){var b=u(c.debugID),a=u(c.debugID+"-toggle");if(!b)return!1;oa?(a.innerHTML="+",b.style.display="none"):(a.innerHTML="-",b.style.display="block");oa=!oa};w=function(b,a,c){if("undefined"!==typeof sm2Debugger)try{sm2Debugger.handleEvent(b,
+a,c)}catch(f){}return!0};L=function(){var b=[];c.debugMode&&b.push("sm2_debug");c.debugFlash&&b.push("flash_debug");c.useHighPerformance&&b.push("high_performance");return b.join(" ")};va=function(){var b=q("fbHandler"),a=c.getMoviePercent(),d={type:"FLASHBLOCK"};if(c.html5Only)return!1;if(c.ok()){if(c.didFlashBlock&&c._wD(b+": Unblocked"),c.oMC)c.oMC.className=[L(),"movieContainer","swf_loaded"+(c.didFlashBlock?" swf_unblocked":"")].join(" ")}else{if(z)c.oMC.className=L()+" movieContainer "+(null===
+a?"swf_timedout":"swf_error"),c._wD(b+": "+q("fbTimeout")+(a?" ("+q("fbLoaded")+")":""));c.didFlashBlock=!0;H({type:"ontimeout",ignoreInit:!0,error:d});K(d)}};pa=function(b,a,c){"undefined"===typeof B[b]&&(B[b]=[]);B[b].push({method:a,scope:c||null,fired:!1})};H=function(b){b||(b={type:"onready"});if(!n&&b&&!b.ignoreInit||"ontimeout"===b.type&&c.ok())return!1;var a={success:b&&b.ignoreInit?c.ok():!y},d=b&&b.type?B[b.type]||[]:[],f=[],e,h=[a],g=z&&c.useFlashBlock&&!c.ok();if(b.error)h[0].error=b.error;
+for(a=0,e=d.length;a<e;a++)!0!==d[a].fired&&f.push(d[a]);if(f.length){c._wD("soundManager: Firing "+f.length+" "+b.type+"() item"+(1===f.length?"":"s"));for(a=0,e=f.length;a<e;a++)if(f[a].scope?f[a].method.apply(f[a].scope,h):f[a].method.apply(this,h),!g)f[a].fired=!0}return!0};I=function(){j.setTimeout(function(){c.useFlashBlock&&va();H();c.onload instanceof Function&&(o("onload",1),c.onload.apply(j),o("onloadOK",1));c.waitForWindowLoad&&r.add(j,"load",I)},1)};ka=function(){if(void 0!==t)return t;
+var b=!1,a=navigator,c=a.plugins,f,e=j.ActiveXObject;if(c&&c.length)(a=a.mimeTypes)&&a["application/x-shockwave-flash"]&&a["application/x-shockwave-flash"].enabledPlugin&&a["application/x-shockwave-flash"].enabledPlugin.description&&(b=!0);else if("undefined"!==typeof e){try{f=new e("ShockwaveFlash.ShockwaveFlash")}catch(h){}b=!!f}return t=b};Na=function(){var b,a;if(Aa&&p.match(/os (1|2|3_0|3_1)/i)){c.hasHTML5=!1;c.html5Only=!0;if(c.oMC)c.oMC.style.display="none";return!1}if(c.useHTML5Audio){if(!c.html5||
+!c.html5.canPlayType)return c._wD("SoundManager: No HTML5 Audio() support detected."),c.hasHTML5=!1,!0;c.hasHTML5=!0;if(Ca&&(c._wD("soundManager::Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - "+(!t?" would use flash fallback for MP3/MP4, but none detected.":"will use flash fallback for MP3/MP4, if available"),1),ka()))return!0}else return!0;for(a in c.audioFormats)if(c.audioFormats.hasOwnProperty(a)&&(c.audioFormats[a].required&&!c.html5.canPlayType(c.audioFormats[a].type)||
+c.flash[a]||c.flash[c.audioFormats[a].type]))b=!0;c.ignoreFlash&&(b=!1);c.html5Only=c.hasHTML5&&c.useHTML5Audio&&!b;return!c.html5Only};ia=function(b){var a,d,f=0;if(b instanceof Array){for(a=0,d=b.length;a<d;a++)if(b[a]instanceof Object){if(c.canPlayMIME(b[a].type)){f=a;break}}else if(c.canPlayURL(b[a])){f=a;break}if(b[f].url)b[f]=b[f].url;return b[f]}return b};Ka=function(b){if(!b._hasTimer)b._hasTimer=!0,!Ba&&c.html5PollingInterval&&(null===T&&0===ha&&(T=G.setInterval(Ma,c.html5PollingInterval)),
+ha++)};La=function(b){if(b._hasTimer)b._hasTimer=!1,!Ba&&c.html5PollingInterval&&ha--};Ma=function(){var b;if(null!==T&&!ha)return G.clearInterval(T),T=null,!1;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].isHTML5&&c.sounds[c.soundIDs[b]]._hasTimer&&c.sounds[c.soundIDs[b]]._onTimer()};K=function(b){b="undefined"!==typeof b?b:{};c.onerror instanceof Function&&c.onerror.apply(j,[{type:"undefined"!==typeof b.type?b.type:null}]);"undefined"!==typeof b.fatal&&b.fatal&&c.disable()};Qa=function(){if(!Ca||
+!ka())return!1;var b=c.audioFormats,a,d;for(d in b)if(b.hasOwnProperty(d)&&("mp3"===d||"mp4"===d))if(c._wD("soundManager: Using flash fallback for "+d+" format"),c.html5[d]=!1,b[d]&&b[d].related)for(a=b[d].related.length;a--;)c.html5[b[d].related[a]]=!1};this._setSandboxType=function(b){var a=c.sandbox;a.type=b;a.description=a.types["undefined"!==typeof a.types[b]?b:"unknown"];c._wD("Flash security sandbox type: "+a.type);if("localWithFile"===a.type)a.noRemote=!0,a.noLocal=!1,o("secNote",2);else if("localWithNetwork"===
+a.type)a.noRemote=!1,a.noLocal=!0;else if("localTrusted"===a.type)a.noRemote=!1,a.noLocal=!1};this._externalInterfaceOK=function(b,a){if(c.swfLoaded)return!1;var d,f=(new Date).getTime();c._wD("soundManager::externalInterfaceOK()"+(b?" (~"+(f-b)+" ms)":""));w("swf",!0);w("flashtojs",!0);c.swfLoaded=!0;M=!1;Ca&&Qa();if(!a||a.replace(/\+dev/i,"")!==c.versionNumber.replace(/\+dev/i,""))return d='soundManager: Fatal: JavaScript file build "'+c.versionNumber+'" does not match Flash SWF build "'+a+'" at '+
+c.url+". Ensure both are up-to-date.",setTimeout(function(){throw Error(d);},0),!1;D?setTimeout(X,100):X()};ca=function(b,a){function d(){c._wD("-- SoundManager 2 "+c.version+(!c.html5Only&&c.useHTML5Audio?c.hasHTML5?" + HTML5 audio":", no HTML5 audio support":"")+(!c.html5Only?(c.useHighPerformance?", high performance mode, ":", ")+((c.flashPollingInterval?"custom ("+c.flashPollingInterval+"ms)":"normal")+" polling")+(c.wmode?", wmode: "+c.wmode:"")+(c.debugFlash?", flash debug mode":"")+(c.useFlashBlock?
+", flashBlock mode":""):"")+" --",1)}function f(a,b){return'<param name="'+a+'" value="'+b+'" />'}if(P&&Q)return!1;if(c.html5Only)return qa(),d(),c.oMC=u(c.movieID),X(),Q=P=!0,!1;var e=a||c.url,i=c.altURL||e,g;g=ba();var j,m,k=L(),l,n=null,n=(n=h.getElementsByTagName("html")[0])&&n.dir&&n.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;qa();c.url=Ia(N?e:i);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!D&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))o("spcWmode"),
+c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Va+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(D)e=h.createElement("div"),m=['<object id="'+b+'" data="'+a+'" type="'+g.type+'" title="'+g.title+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+
+Va+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="'+g.width+'" height="'+g.height+'">',f("movie",a),f("AllowScriptAccess",c.allowScriptAccess),f("quality",g.quality),c.wmode?f("wmode",c.wmode):"",f("bgcolor",c.bgColor),f("hasPriority","true"),c.debugFlash?f("FlashVars",g.FlashVars):"","</object>"].join("");else for(j in e=h.createElement("embed"),g)g.hasOwnProperty(j)&&e.setAttribute(j,g[j]);ta();k=L();if(g=ba())if(c.oMC=u(c.movieID)||h.createElement("div"),
+c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(k?" "+k:"");c.oMC.appendChild(e);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+k;j=k=null;if(!c.useFlashBlock)if(c.useHighPerformance)k={position:"fixed",width:"8px",height:"8px",bottom:"0px",left:"0px",overflow:"hidden"};else if(k={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},n)k.left=Math.abs(parseInt(k.left,
+10))+"px";if(cb)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in k)k.hasOwnProperty(l)&&(c.oMC.style[l]=k[l]);try{D||c.oMC.appendChild(e);g.appendChild(c.oMC);if(D)j=c.oMC.appendChild(h.createElement("div")),j.className="sm2-object-box",j.innerHTML=m;Q=!0}catch(r){throw Error(q("domError")+" \n"+r.toString());}}P=!0;d();c._wD("soundManager::createMovie(): Trying to load "+a+(!N&&c.altURL?" (alternate URL)":""),1);return!0};aa=function(){if(c.html5Only)return ca(),!1;if(i)return!1;i=c.getMovie(c.id);
+if(!i)S?(D?c.oMC.innerHTML=ua:c.oMC.appendChild(S),S=null,P=!0):ca(c.id,c.url),i=c.getMovie(c.id);i&&o("waitEI");c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};Z=function(){setTimeout(Fa,1E3)};Fa=function(){if(ga)return!1;ga=!0;r.remove(j,"load",Z);if(M&&!Da)return o("waitFocus"),!1;var b;n||(b=c.getMoviePercent(),c._wD(q("waitImpatient",100===b?" (SWF loaded)":0<b?" (SWF "+b+"% loaded)":"")));setTimeout(function(){b=c.getMoviePercent();n||(c._wD("soundManager: No Flash response within expected time.\nLikely causes: "+
+(0===b?"Loading "+c.movieURL+" may have failed (and/or Flash "+m+"+ not present?), ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash?" "+q("checkSWF"):""),2),!N&&b&&(o("localFail",2),c.debugFlash||o("tryDebug",2)),0===b&&c._wD(q("swf404",c.url)),w("flashtojs",!1,": Timed out"+N?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));!n&&Ta&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&va(),o("waitForever")):da(!0):0===c.flashLoadTimeout?o("waitForever"):
+da(!0))},c.flashLoadTimeout)};E=function(){function b(){r.remove(j,"focus",E);r.remove(j,"load",E)}if(Da||!M)return b(),!0;Da=Ta=!0;c._wD("soundManager::handleFocus()");V&&M&&r.remove(j,"mousemove",E);ga=!1;b();return!0};Ra=function(){var b,a=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&a.push(b+": "+c.html5[b]+(!c.html5[b]&&t&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&t?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?
+"required, ":"")+"and no flash support)":""));c._wD("-- SoundManager 2: HTML5 support tests ("+c.html5Test+"): "+a.join(", ")+" --",1)}};R=function(b){if(n)return!1;if(c.html5Only)return c._wD("-- SoundManager 2: loaded --"),n=!0,I(),w("onload",!0),!0;var a;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())n=!0,y&&(a={type:!t&&z?"NO_FLASH":"INIT_TIMEOUT"});c._wD("-- SoundManager 2 "+(y?"failed to load":"loaded")+" ("+(y?"security/load error":"OK")+") --",1);if(y||b){if(c.useFlashBlock&&
+c.oMC)c.oMC.className=L()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error");H({type:"ontimeout",error:a});w("onload",!1);K(a);return!1}w("onload",!0);if(c.waitForWindowLoad&&!Y)return o("waitOnload"),r.add(j,"load",I),!1;c.waitForWindowLoad&&Y&&o("docLoaded");I();return!0};X=function(){o("init");if(n)return o("didInit"),!1;if(c.html5Only){if(!n)r.remove(j,"load",c.beginDelayedInit),c.enabled=!0,R();return!0}aa();try{o("flashJS"),i._externalInterfaceTest(!1),Ga(!0,c.flashPollingInterval||
+(c.useHighPerformance?10:50)),c.debugMode||i._disableDebug(),c.enabled=!0,w("jstoflash",!0),c.html5Only||r.add(j,"unload",na)}catch(b){return c._wD("js/flash exception: "+b.toString()),w("jstoflash",!1),K({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),da(!0),R(),!1}R();r.remove(j,"load",c.beginDelayedInit);return!0};J=function(){if(sa)return!1;sa=!0;ta();var b=O.toLowerCase(),a=null,a=null,d="undefined"!==typeof console&&"undefined"!==typeof console.log;if(-1!==b.indexOf("sm2-usehtml5audio="))a="1"===b.charAt(b.indexOf("sm2-usehtml5audio=")+
+18),d&&console.log((a?"Enabling ":"Disabling ")+"useHTML5Audio via URL parameter"),c.useHTML5Audio=a;if(-1!==b.indexOf("sm2-preferflash="))a="1"===b.charAt(b.indexOf("sm2-preferflash=")+16),d&&console.log((a?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.preferFlash=a;if(!t&&c.hasHTML5)c._wD("SoundManager: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode.")),c.useHTML5Audio=!0,c.preferFlash=!1;Oa();c.html5.usingFlash=Na();z=c.html5.usingFlash;Ra();if(!t&&
+z)c._wD("SoundManager: Fatal error: Flash is needed to play some required formats, but is not available."),c.flashLoadTimeout=1;h.removeEventListener&&h.removeEventListener("DOMContentLoaded",J,!1);aa();return!0};za=function(){"complete"===h.readyState&&(J(),h.detachEvent("onreadystatechange",za));return!0};ra=function(){Y=!0;r.remove(j,"load",ra)};ka();r.add(j,"focus",E);r.add(j,"load",E);r.add(j,"load",Z);r.add(j,"load",ra);V&&M&&r.add(j,"mousemove",E);h.addEventListener?h.addEventListener("DOMContentLoaded",
+J,!1):h.attachEvent?h.attachEvent("onreadystatechange",za):(w("onload",!1),K({type:"NO_DOM2_EVENTS",fatal:!0}));"complete"===h.readyState&&setTimeout(J,100)}var la=null;if("undefined"===typeof SM2_DEFER||!SM2_DEFER)la=new W;G.SoundManager=W;G.soundManager=la})(window); \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug-jsmin.js b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug-jsmin.js
new file mode 100755
index 0000000..f829d2c
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug-jsmin.js
@@ -0,0 +1,77 @@
+/** @license
+ *
+ * SoundManager 2: JavaScript Sound for the Web
+ * ----------------------------------------------
+ * http://schillmania.com/projects/soundmanager2/
+ *
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/soundmanager2/license.txt
+ *
+ * V2.97a.20111220
+ */
+(function(J){function R(R,ea){function l(b){return function(a){var c=this._t;return!c||!c._a?null:b.call(this,a)}}this.flashVersion=8;this.debugFlash=this.debugMode=!1;this.consoleOnly=this.useConsole=!0;this.waitForWindowLoad=!1;this.bgColor="#ffffff";this.useHighPerformance=!1;this.html5PollingInterval=this.flashPollingInterval=null;this.flashLoadTimeout=1E3;this.wmode=null;this.allowScriptAccess="always";this.useFlashBlock=!1;this.useHTML5Audio=!0;this.html5Test=/^(probably|maybe)$/i;this.preferFlash=
+!0;this.noSWFCache=!1;this.audioFormats={mp3:{type:['audio/mpeg; codecs="mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a"],type:['audio/mp4; codecs="mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs=vorbis"],required:!1},wav:{type:['audio/wav; codecs="1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,
+onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.movieID="sm2-container";this.id=ea||"sm2movie";
+this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20111220";this.movieURL=this.version=null;this.url=R||null;this.altURL=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};var fa;try{fa="undefined"!==typeof Audio&&
+"undefined"!==typeof(new Audio).canPlayType}catch(Xa){fa=!1}this.hasHTML5=fa;this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var Aa,c=this,h=null,S,p=navigator.userAgent,j=J,ga=j.location.href.toString(),k=document,ha,T,i,v=[],K=!1,L=!1,m=!1,w=!1,ia=!1,M,q,ja,C,D,U,Ba,ka,A,V,E,la,ma,na,W,F,Ca,oa,Da,X,Ea,N=null,pa=null,G,qa,H,Y,Z,ra,o,$=!1,sa=!1,Fa,Ga,Ha,aa=0,O=null,ba,s=null,Ia,ca,P,x,ta,ua,Ja,n,Ra=Array.prototype.slice,B=!1,r,da,Ka,u,La,va=p.match(/(ipad|iphone|ipod)/i),
+Sa=p.match(/firefox/i),Ta=p.match(/droid/i),y=p.match(/msie/i),Ua=p.match(/webkit/i),Q=p.match(/safari/i)&&!p.match(/chrome/i),Va=p.match(/opera/i),wa=p.match(/(mobile|pre\/|xoom)/i)||va,xa=!ga.match(/usehtml5audio/i)&&!ga.match(/sm2\-ignorebadua/i)&&Q&&!p.match(/silk/i)&&p.match(/OS X 10_6_([3-7])/i),ya="undefined"!==typeof k.hasFocus?k.hasFocus():null,I=Q&&"undefined"===typeof k.hasFocus,Ma=!I,Na=/(mp3|mp4|mpa)/i,za=k.location?k.location.protocol.match(/http/i):null,Oa=!za?"http://":"",Pa=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i,
+Qa="mpeg4,aac,flv,mov,mp4,m4v,f4v,m4a,mp4v,3gp,3g2".split(","),Wa=RegExp("\\.("+Qa.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!za;this._global_a=null;if(wa&&(c.useHTML5Audio=!0,c.preferFlash=!1,va))B=c.ignoreFlash=!0;this.supported=this.ok=function(){return s?m&&!w:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return S(b)||k[b]||j[b]};this.createSound=function(b){function a(){e=Y(e);c.sounds[d.id]=new Aa(d);c.soundIDs.push(d.id);
+return c.sounds[d.id]}var e=null,f=null,d=null;if(!m||!c.ok())return ra(void 0),!1;2===arguments.length&&(b={id:arguments[0],url:arguments[1]});e=q(b);e.url=ba(e.url);d=e;if(o(d.id,!0))return c.sounds[d.id];if(ca(d))f=a(),f._setup_html5(d);else{if(8<i){if(null===d.isMovieStar)d.isMovieStar=d.serverURL||(d.type?d.type.match(Pa):!1)||d.url.match(Wa);if(d.isMovieStar&&d.usePeakData)d.usePeakData=!1}d=Z(d,void 0);f=a();if(8===i)h._createSound(d.id,d.loops||1,d.usePolicyFile);else if(h._createSound(d.id,
+d.url,d.usePeakData,d.useWaveformData,d.useEQData,d.isMovieStar,d.isMovieStar?d.bufferTime:!1,d.loops||1,d.serverURL,d.duration||null,d.autoPlay,!0,d.autoLoad,d.usePolicyFile),!d.serverURL)f.connected=!0,d.onconnect&&d.onconnect.apply(f);!d.serverURL&&(d.autoLoad||d.autoPlay)&&f.load(d)}!d.serverURL&&d.autoPlay&&f.play();return f};this.destroySound=function(b,a){if(!o(b))return!1;var e=c.sounds[b],f;e._iO={};e.stop();e.unload();for(f=0;f<c.soundIDs.length;f++)if(c.soundIDs[f]===b){c.soundIDs.splice(f,
+1);break}a||e.destruct(!0);delete c.sounds[b];return!0};this.load=function(b,a){return!o(b)?!1:c.sounds[b].load(a)};this.unload=function(b){return!o(b)?!1:c.sounds[b].unload()};this.onposition=this.onPosition=function(b,a,e,f){return!o(b)?!1:c.sounds[b].onposition(a,e,f)};this.clearOnPosition=function(b,a,e){return!o(b)?!1:c.sounds[b].clearOnPosition(a,e)};this.start=this.play=function(b,a){if(!m||!c.ok())return ra("soundManager.play(): "+G(!m?"notReady":"notOK")),!1;if(!o(b)){a instanceof Object||
+(a={url:a});return a&&a.url?(a.id=b,c.createSound(a).play()):!1}return c.sounds[b].play(a)};this.setPosition=function(b,a){return!o(b)?!1:c.sounds[b].setPosition(a)};this.stop=function(b){return!o(b)?!1:c.sounds[b].stop()};this.stopAll=function(){for(var b in c.sounds)c.sounds.hasOwnProperty(b)&&c.sounds[b].stop()};this.pause=function(b){return!o(b)?!1:c.sounds[b].pause()};this.pauseAll=function(){var b;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].pause()};this.resume=function(b){return!o(b)?
+!1:c.sounds[b].resume()};this.resumeAll=function(){var b;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].resume()};this.togglePause=function(b){return!o(b)?!1:c.sounds[b].togglePause()};this.setPan=function(b,a){return!o(b)?!1:c.sounds[b].setPan(a)};this.setVolume=function(b,a){return!o(b)?!1:c.sounds[b].setVolume(a)};this.mute=function(b){var a=0;"string"!==typeof b&&(b=null);if(b)return!o(b)?!1:c.sounds[b].mute();for(a=c.soundIDs.length;a--;)c.sounds[c.soundIDs[a]].mute();return c.muted=!0};
+this.muteAll=function(){c.mute()};this.unmute=function(b){"string"!==typeof b&&(b=null);if(b)return!o(b)?!1:c.sounds[b].unmute();for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].unmute();c.muted=!1;return!0};this.unmuteAll=function(){c.unmute()};this.toggleMute=function(b){return!o(b)?!1:c.sounds[b].toggleMute()};this.getMemoryUse=function(){var b=0;h&&8!==i&&(b=parseInt(h._getMemoryUse(),10));return b};this.disable=function(b){var a;"undefined"===typeof b&&(b=!1);if(w)return!1;w=!0;for(a=c.soundIDs.length;a--;)Da(c.sounds[c.soundIDs[a]]);
+M(b);n.remove(j,"load",D);return!0};this.canPlayMIME=function(b){var a;c.hasHTML5&&(a=P({type:b}));return!s||a?a:b?!!(8<i&&b.match(Pa)||b.match(c.mimePattern)):null};this.canPlayURL=function(b){var a;c.hasHTML5&&(a=P({url:b}));return!s||a?a:b?!!b.match(c.filePattern):null};this.canPlayLink=function(b){return"undefined"!==typeof b.type&&b.type&&c.canPlayMIME(b.type)?!0:c.canPlayURL(b.href)};this.getSoundById=function(b){if(!b)throw Error("soundManager.getSoundById(): sID is null/undefined");return c.sounds[b]};
+this.onready=function(b,a){if(b&&b instanceof Function)return a||(a=j),ja("onready",b,a),C(),!0;throw G("needFunction","onready");};this.ontimeout=function(b,a){if(b&&b instanceof Function)return a||(a=j),ja("ontimeout",b,a),C({type:"ontimeout"}),!0;throw G("needFunction","ontimeout");};this._wD=this._writeDebug=function(){return!0};this._debug=function(){};this.reboot=function(){var b,a;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].destruct();try{if(y)pa=h.innerHTML;N=h.parentNode.removeChild(h)}catch(e){}pa=
+N=s=null;c.enabled=ma=m=$=sa=K=L=w=c.swfLoaded=!1;c.soundIDs=c.sounds=[];h=null;for(b in v)if(v.hasOwnProperty(b))for(a=v[b].length;a--;)v[b][a].fired=!1;j.setTimeout(c.beginDelayedInit,20)};this.getMoviePercent=function(){return h&&"undefined"!==typeof h.PercentLoaded?h.PercentLoaded():null};this.beginDelayedInit=function(){ia=!0;E();setTimeout(function(){if(sa)return!1;W();V();return sa=!0},20);U()};this.destruct=function(){c.disable(!0)};Aa=function(b){var a=this,e,f,d,g,z,j,k=!1,t=[],l=0,n,p,
+m=null,r=null,s=null;this.sID=b.id;this.url=b.url;this._iO=this.instanceOptions=this.options=q(b);this.pan=this.options.pan;this.volume=this.options.volume;this.isHTML5=!1;this._a=null;this.id3={};this._debug=function(){};this.load=function(b){var c=null;if("undefined"!==typeof b)a._iO=q(b,a.options),a.instanceOptions=a._iO;else if(b=a.options,a._iO=b,a.instanceOptions=a._iO,m&&m!==a.url)a._iO.url=a.url,a.url=null;if(!a._iO.url)a._iO.url=a.url;a._iO.url=ba(a._iO.url);if(a._iO.url===a.url&&0!==a.readyState&&
+2!==a.readyState)return 3===a.readyState&&a._iO.onload&&a._iO.onload.apply(a,[!!a.duration]),a;b=a._iO;m=a.url;a.loaded=!1;a.readyState=1;a.playState=0;if(ca(b)){if(c=a._setup_html5(b),!c._called_load)a._html5_canplay=!1,a._a.autobuffer="auto",a._a.preload="auto",c.load(),c._called_load=!0,b.autoPlay&&a.play()}else try{a.isHTML5=!1,a._iO=Z(Y(b)),b=a._iO,8===i?h._load(a.sID,b.url,b.stream,b.autoPlay,b.whileloading?1:0,b.loops||1,b.usePolicyFile):h._load(a.sID,b.url,!!b.stream,!!b.autoPlay,b.loops||
+1,!!b.autoLoad,b.usePolicyFile)}catch(d){F({type:"SMSOUND_LOAD_JS_EXCEPTION",fatal:!0})}return a};this.unload=function(){0!==a.readyState&&(a.isHTML5?(g(),a._a&&(a._a.pause(),ta(a._a))):8===i?h._unload(a.sID,"about:blank"):h._unload(a.sID),e());return a};this.destruct=function(b){if(a.isHTML5){if(g(),a._a)a._a.pause(),ta(a._a),B||d(),a._a._t=null,a._a=null}else a._iO.onfailure=null,h._destroySound(a.sID);b||c.destroySound(a.sID,!0)};this.start=this.play=function(b,c){var d,c=void 0===c?!0:c;b||(b=
+{});a._iO=q(b,a._iO);a._iO=q(a._iO,a.options);a._iO.url=ba(a._iO.url);a.instanceOptions=a._iO;if(a._iO.serverURL&&!a.connected)return a.getAutoPlay()||a.setAutoPlay(!0),a;ca(a._iO)&&(a._setup_html5(a._iO),z());if(1===a.playState&&!a.paused&&(d=a._iO.multiShot,!d))return a;if(!a.loaded)if(0===a.readyState){if(!a.isHTML5)a._iO.autoPlay=!0;a.load(a._iO)}else if(2===a.readyState)return a;if(!a.isHTML5&&9===i&&0<a.position&&a.position===a.duration)b.position=0;if(a.paused&&a.position&&0<a.position)a.resume();
+else{a._iO=q(b,a._iO);if(null!==a._iO.from&&null!==a._iO.to&&0===a.instanceCount&&0===a.playState&&!a._iO.serverURL){d=function(){a._iO=q(b,a._iO);a.play(a._iO)};if(a.isHTML5&&!a._html5_canplay)return a.load({_oncanplay:d}),!1;if(!a.isHTML5&&!a.loaded&&(!a.readyState||2!==a.readyState))return a.load({onload:d}),!1;a._iO=p()}(!a.instanceCount||a._iO.multiShotEvents||!a.isHTML5&&8<i&&!a.getAutoPlay())&&a.instanceCount++;0===a.playState&&a._iO.onposition&&j(a);a.playState=1;a.paused=!1;a.position="undefined"!==
+typeof a._iO.position&&!isNaN(a._iO.position)?a._iO.position:0;if(!a.isHTML5)a._iO=Z(Y(a._iO));a._iO.onplay&&c&&(a._iO.onplay.apply(a),k=!0);a.setVolume(a._iO.volume,!0);a.setPan(a._iO.pan,!0);a.isHTML5?(z(),d=a._setup_html5(),a.setPosition(a._iO.position),d.play()):h._start(a.sID,a._iO.loops||1,9===i?a._iO.position:a._iO.position/1E3)}return a};this.stop=function(b){var c=a._iO;if(1===a.playState){a._onbufferchange(0);a._resetOnPosition(0);a.paused=!1;if(!a.isHTML5)a.playState=0;n();c.to&&a.clearOnPosition(c.to);
+if(a.isHTML5){if(a._a)b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()}else h._stop(a.sID,b),c.serverURL&&a.unload();a.instanceCount=0;a._iO={};c.onstop&&c.onstop.apply(a)}return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5||(h._setAutoPlay(a.sID,b),b&&!a.instanceCount&&1===a.readyState&&a.instanceCount++)};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){void 0===b&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||
+a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(a.isHTML5){if(a._a&&a._html5_canplay&&a._a.currentTime!==b)try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(d){}}else b=9===i?a.position:b,a.readyState&&2!==a.readyState&&h._setPosition(a.sID,b,a.paused||!a.playState);a.isHTML5&&a.paused&&a._onTimer(!0);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),
+g()):(b||void 0===b)&&h._pause(a.sID);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),z()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),h._pause(a.sID));k&&b.onplay?(b.onplay.apply(a),k=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9===i&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();
+return a};this.setPan=function(b,c){"undefined"===typeof b&&(b=0);"undefined"===typeof c&&(c=!1);a.isHTML5||h._setPan(a.sID,b);a._iO.pan=b;if(!c)a.pan=b,a.options.pan=b;return a};this.setVolume=function(b,d){"undefined"===typeof b&&(b=100);"undefined"===typeof d&&(d=!1);if(a.isHTML5){if(a._a)a._a.volume=Math.max(0,Math.min(1,b/100))}else h._setVolume(a.sID,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;if(!d)a.volume=b,a.options.volume=b;return a};this.mute=function(){a.muted=!0;if(a.isHTML5){if(a._a)a._a.muted=
+!0}else h._setVolume(a.sID,0);return a};this.unmute=function(){a.muted=!1;var b="undefined"!==typeof a._iO.volume;if(a.isHTML5){if(a._a)a._a.muted=!1}else h._setVolume(a.sID,b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){t.push({position:b,method:c,scope:"undefined"!==typeof d?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c,a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c<t.length;c++)if(a===
+t[c].position&&(!b||b===t[c].method))t[c].fired&&l--,t.splice(c,1)};this._processOnPosition=function(){var b,c;b=t.length;if(!b||!a.playState||l>=b)return!1;for(;b--;)if(c=t[b],!c.fired&&a.position>=c.position)c.fired=!0,l++,c.method.apply(c.scope,[c.position]);return!0};this._resetOnPosition=function(a){var b,c;b=t.length;if(!b)return!1;for(;b--;)if(c=t[b],c.fired&&a<=c.position)c.fired=!1,l--;return!0};p=function(){var b=a._iO,c=b.from,d=b.to,e,f;f=function(){a.clearOnPosition(d,f);a.stop()};e=
+function(){if(null!==d&&!isNaN(d))a.onPosition(d,f)};if(null!==c&&!isNaN(c))b.position=c,b.multiShot=!1,e();return b};j=function(){var b=a._iO.onposition;if(b)for(var c in b)if(b.hasOwnProperty(c))a.onPosition(parseInt(c,10),b[c])};n=function(){var b=a._iO.onposition;if(b)for(var c in b)b.hasOwnProperty(c)&&a.clearOnPosition(parseInt(c,10))};z=function(){a.isHTML5&&Fa(a)};g=function(){a.isHTML5&&Ga(a)};e=function(){t=[];l=0;k=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=
+null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null};e();this._onTimer=function(b){var c,d=!1,e={};if(a._hasTimer||b){if(a._a&&(b||(0<a.playState||1===a.readyState)&&!a.paused)){c=a._get_html5_duration();
+if(c!==r)r=c,a.duration=c,d=!0;a.durationEstimate=a.duration;c=1E3*a._a.currentTime||0;c!==s&&(s=c,d=!0);(d||b)&&a._whileplaying(c,e,e,e,e);return d}return!1}};this._get_html5_duration=function(){var b=a._iO,c=a._a?1E3*a._a.duration:b?b.duration:void 0;return c&&!isNaN(c)&&Infinity!==c?c:b?b.duration:null};this._setup_html5=function(b){var b=q(a._iO,b),d=decodeURI,g=B?c._global_a:a._a,h=d(b.url),z=g&&g._t?g._t.instanceOptions:null;if(g){if(g._t&&(!B&&h===d(m)||B&&z.url===b.url&&(!m||m===z.url)))return g;
+B&&g._t&&g._t.playState&&b.url!==z.url&&g._t.stop();e();g.src=b.url;m=a.url=b.url;g._called_load=!1}else{g=new Audio(b.url);g._called_load=!1;if(Ta)g._called_load=!0;if(B)c._global_a=g}a.isHTML5=!0;a._a=g;g._t=a;f();g.loop=1<b.loops?"loop":"";b.autoLoad||b.autoPlay?a.load():(g.autobuffer=!1,g.preload="none");g.loop=1<b.loops?"loop":"";return g};f=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in u)u.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,u[b],!1);return!0};d=
+function(){var b;a._a._added_events=!1;for(b in u)u.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,u[b],!1)};this._onload=function(b){b=!!b;a.loaded=b;a.readyState=b?3:2;a._onbufferchange(0);a._iO.onload&&a._iO.onload.apply(a,[b]);return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a);return!0};
+this._onfailure=function(b,c,d){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,c,d)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount){a.instanceCount--;if(!a.instanceCount)n(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g();(!a.instanceCount||a._iO.multiShotEvents)&&b&&b.apply(a)}};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=
+e;if(f.isMovieStar)a.durationEstimate=a.duration;else if(a.durationEstimate=f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10),void 0===a.durationEstimate)a.durationEstimate=a.duration;3!==a.readyState&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var g=a._iO;if(isNaN(b)||null===b)return!1;a.position=b;a._processOnPosition();if(!a.isHTML5&&8<i){if(g.usePeakData&&"undefined"!==typeof c&&c)a.peakData={left:c.leftPeak,
+right:c.rightPeak};if(g.useWaveformData&&"undefined"!==typeof d&&d)a.waveformData={left:d.split(","),right:e.split(",")};if(g.useEQData&&"undefined"!==typeof f&&f&&f.leftEQ&&(b=f.leftEQ.split(","),a.eqData=b,a.eqData.left=b,"undefined"!==typeof f.rightEQ&&f.rightEQ))a.eqData.right=f.rightEQ.split(",")}1===a.playState&&(!a.isHTML5&&8===i&&!a.position&&a.isBuffering&&a._onbufferchange(0),g.whileplaying&&g.whileplaying.apply(a));return!0};this._onmetadata=function(b,c){var d={},e,f;for(e=0,f=b.length;e<
+f;e++)d[b[e]]=c[e];a.metadata=d;a._iO.onmetadata&&a._iO.onmetadata.apply(a)};this._onid3=function(b,c){var d=[],e,f;for(e=0,f=b.length;e<f;e++)d[b[e]]=c[e];a.id3=q(a.id3,d);a._iO.onid3&&a._iO.onid3.apply(a)};this._onconnect=function(b){b=1===b;if(a.connected=b)a.failures=0,o(a.sID)&&(a.getAutoPlay()?a.play(void 0,a.getAutoPlay()):a._iO.autoLoad&&a.load()),a._iO.onconnect&&a._iO.onconnect.apply(a,[b])};this._ondataerror=function(){0<a.playState&&a._iO.ondataerror&&a._iO.ondataerror.apply(a)}};na=function(){return k.body||
+k._docElement||k.getElementsByTagName("div")[0]};S=function(b){return k.getElementById(b)};q=function(b,a){var e={},f,d;for(f in b)b.hasOwnProperty(f)&&(e[f]=b[f]);f="undefined"===typeof a?c.defaultOptions:a;for(d in f)f.hasOwnProperty(d)&&"undefined"===typeof e[d]&&(e[d]=f[d]);return e};n=function(){function b(a){var a=Ra.call(a),b=a.length;c?(a[1]="on"+a[1],3<b&&a.pop()):3===b&&a.push(!1);return a}function a(a,b){var h=a.shift(),k=[f[b]];if(c)h[k](a[0],a[1]);else h[k].apply(h,a)}var c=j.attachEvent,
+f={add:c?"attachEvent":"addEventListener",remove:c?"detachEvent":"removeEventListener"};return{add:function(){a(b(arguments),"add")},remove:function(){a(b(arguments),"remove")}}}();u={abort:l(function(){}),canplay:l(function(){var b=this._t;if(b._html5_canplay)return!0;b._html5_canplay=!0;b._onbufferchange(0);var a=!isNaN(b.position)?b.position/1E3:null;if(b.position&&this.currentTime!==a)try{this.currentTime=a}catch(c){}b._iO._oncanplay&&b._iO._oncanplay()}),load:l(function(){var b=this._t;b.loaded||
+(b._onbufferchange(0),b._whileloading(b.bytesTotal,b.bytesTotal,b._get_html5_duration()),b._onload(!0))}),emptied:l(function(){}),ended:l(function(){this._t._onfinish()}),error:l(function(){this._t._onload(!1)}),loadeddata:l(function(){var b=this._t,a=b.bytesTotal||1;if(!b._loaded&&!Q)b.duration=b._get_html5_duration(),b._whileloading(a,a,b._get_html5_duration()),b._onload(!0)}),loadedmetadata:l(function(){}),loadstart:l(function(){this._t._onbufferchange(1)}),play:l(function(){this._t._onbufferchange(0)}),
+playing:l(function(){this._t._onbufferchange(0)}),progress:l(function(b){var a=this._t;if(a.loaded)return!1;var c,f=0,d=b.target.buffered;c=b.loaded||0;var g=b.total||1;if(d&&d.length){for(c=d.length;c--;)f=d.end(c)-d.start(c);c=f/b.target.duration}isNaN(c)||(a._onbufferchange(0),a._whileloading(c,g,a._get_html5_duration()),c&&g&&c===g&&u.load.call(this,b))}),ratechange:l(function(){}),suspend:l(function(b){var a=this._t;u.progress.call(this,b);a._onsuspend()}),stalled:l(function(){}),timeupdate:l(function(){this._t._onTimer()}),
+waiting:l(function(){this._t._onbufferchange(1)})};ca=function(b){return!b.serverURL&&(b.type?P({type:b.type}):P({url:b.url})||c.html5Only)};ta=function(b){if(b)b.src=Sa?"":"about:blank"};P=function(b){function a(a){return c.preferFlash&&r&&!c.ignoreFlash&&"undefined"!==typeof c.flash[a]&&c.flash[a]}if(!c.useHTML5Audio||!c.hasHTML5)return!1;var e=b.url||null,b=b.type||null,f=c.audioFormats,d;if(b&&"undefined"!==c.html5[b])return c.html5[b]&&!a(b);if(!x){x=[];for(d in f)f.hasOwnProperty(d)&&(x.push(d),
+f[d].related&&(x=x.concat(f[d].related)));x=RegExp("\\.("+x.join("|")+")(\\?.*)?$","i")}d=e?e.toLowerCase().match(x):null;if(!d||!d.length)if(b)e=b.indexOf(";"),d=(-1!==e?b.substr(0,e):b).substr(6);else return!1;else d=d[1];if(d&&"undefined"!==typeof c.html5[d])return c.html5[d]&&!a(d);b="audio/"+d;e=c.html5.canPlayType({type:b});return(c.html5[d]=e)&&c.html5[b]&&!a(b)};Ja=function(){function b(b){var d,e,f=!1;if(!a||"function"!==typeof a.canPlayType)return!1;if(b instanceof Array){for(d=0,e=b.length;d<
+e&&!f;d++)if(c.html5[b[d]]||a.canPlayType(b[d]).match(c.html5Test))f=!0,c.html5[b[d]]=!0,c.flash[b[d]]=!(!c.preferFlash||!r||!b[d].match(Na));return f}b=a&&"function"===typeof a.canPlayType?a.canPlayType(b):!1;return!(!b||!b.match(c.html5Test))}if(!c.useHTML5Audio||"undefined"===typeof Audio)return!1;var a="undefined"!==typeof Audio?Va?new Audio(null):new Audio:null,e,f={},d,g;d=c.audioFormats;for(e in d)if(d.hasOwnProperty(e)&&(f[e]=b(d[e].type),f["audio/"+e]=f[e],c.flash[e]=c.preferFlash&&!c.ignoreFlash&&
+e.match(Na)?!0:!1,d[e]&&d[e].related))for(g=d[e].related.length;g--;)f["audio/"+d[e].related[g]]=f[e],c.html5[d[e].related[g]]=f[e],c.flash[d[e].related[g]]=f[e];f.canPlayType=a?b:null;c.html5=q(c.html5,f);return!0};G=function(){};Y=function(b){if(8===i&&1<b.loops&&b.stream)b.stream=!1;return b};Z=function(b){if(b&&!b.usePolicyFile&&(b.onid3||b.usePeakData||b.useWaveformData||b.useEQData))b.usePolicyFile=!0;return b};ra=function(){};ha=function(){return!1};Da=function(b){for(var a in b)b.hasOwnProperty(a)&&
+"function"===typeof b[a]&&(b[a]=ha)};X=function(b){"undefined"===typeof b&&(b=!1);(w||b)&&c.disable(b)};Ea=function(b){var a=null;if(b)if(b.match(/\.swf(\?.*)?$/i)){if(a=b.substr(b.toLowerCase().lastIndexOf(".swf?")+4))return b}else b.lastIndexOf("/")!==b.length-1&&(b+="/");b=(b&&-1!==b.lastIndexOf("/")?b.substr(0,b.lastIndexOf("/")+1):"./")+c.movieURL;c.noSWFCache&&(b+="?ts="+(new Date).getTime());return b};ka=function(){i=parseInt(c.flashVersion,10);if(8!==i&&9!==i)c.flashVersion=i=8;var b=c.debugMode||
+c.debugFlash?"_debug.swf":".swf";if(c.useHTML5Audio&&!c.html5Only&&c.audioFormats.mp4.required&&9>i)c.flashVersion=i=9;c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===i?" (AS3/Flash 9)":" (AS2/Flash 8)");8<i?(c.defaultOptions=q(c.defaultOptions,c.flash9Options),c.features.buffering=!0,c.defaultOptions=q(c.defaultOptions,c.movieStarOptions),c.filePatterns.flash9=RegExp("\\.(mp3|"+Qa.join("|")+")(\\?.*)?$","i"),c.features.movieStar=!0):c.features.movieStar=!1;c.filePattern=c.filePatterns[8!==
+i?"flash9":"flash8"];c.movieURL=(8===i?"soundmanager2.swf":"soundmanager2_flash9.swf").replace(".swf",b);c.features.peakData=c.features.waveformData=c.features.eqData=8<i};Ca=function(b,a){if(!h)return!1;h._setPolling(b,a)};oa=function(){if(c.debugURLParam.test(ga))c.debugMode=!0};o=this.getSoundById;H=function(){var b=[];c.debugMode&&b.push("sm2_debug");c.debugFlash&&b.push("flash_debug");c.useHighPerformance&&b.push("high_performance");return b.join(" ")};qa=function(){G("fbHandler");var b=c.getMoviePercent(),
+a={type:"FLASHBLOCK"};if(c.html5Only)return!1;if(c.ok()){if(c.oMC)c.oMC.className=[H(),"movieContainer","swf_loaded"+(c.didFlashBlock?" swf_unblocked":"")].join(" ")}else{if(s)c.oMC.className=H()+" movieContainer "+(null===b?"swf_timedout":"swf_error");c.didFlashBlock=!0;C({type:"ontimeout",ignoreInit:!0,error:a});F(a)}};ja=function(b,a,c){"undefined"===typeof v[b]&&(v[b]=[]);v[b].push({method:a,scope:c||null,fired:!1})};C=function(b){b||(b={type:"onready"});if(!m&&b&&!b.ignoreInit||"ontimeout"===
+b.type&&c.ok())return!1;var a={success:b&&b.ignoreInit?c.ok():!w},e=b&&b.type?v[b.type]||[]:[],f=[],d,a=[a],g=s&&c.useFlashBlock&&!c.ok();if(b.error)a[0].error=b.error;for(b=0,d=e.length;b<d;b++)!0!==e[b].fired&&f.push(e[b]);if(f.length)for(b=0,d=f.length;b<d;b++)if(f[b].scope?f[b].method.apply(f[b].scope,a):f[b].method.apply(this,a),!g)f[b].fired=!0;return!0};D=function(){j.setTimeout(function(){c.useFlashBlock&&qa();C();c.onload instanceof Function&&c.onload.apply(j);c.waitForWindowLoad&&n.add(j,
+"load",D)},1)};da=function(){if(void 0!==r)return r;var b=!1,a=navigator,c=a.plugins,f,d=j.ActiveXObject;if(c&&c.length)(a=a.mimeTypes)&&a["application/x-shockwave-flash"]&&a["application/x-shockwave-flash"].enabledPlugin&&a["application/x-shockwave-flash"].enabledPlugin.description&&(b=!0);else if("undefined"!==typeof d){try{f=new d("ShockwaveFlash.ShockwaveFlash")}catch(g){}b=!!f}return r=b};Ia=function(){var b,a;if(va&&p.match(/os (1|2|3_0|3_1)/i)){c.hasHTML5=!1;c.html5Only=!0;if(c.oMC)c.oMC.style.display=
+"none";return!1}if(c.useHTML5Audio){if(!c.html5||!c.html5.canPlayType)return c.hasHTML5=!1,!0;c.hasHTML5=!0;if(xa&&da())return!0}else return!0;for(a in c.audioFormats)if(c.audioFormats.hasOwnProperty(a)&&(c.audioFormats[a].required&&!c.html5.canPlayType(c.audioFormats[a].type)||c.flash[a]||c.flash[c.audioFormats[a].type]))b=!0;c.ignoreFlash&&(b=!1);c.html5Only=c.hasHTML5&&c.useHTML5Audio&&!b;return!c.html5Only};ba=function(b){var a,e,f=0;if(b instanceof Array){for(a=0,e=b.length;a<e;a++)if(b[a]instanceof
+Object){if(c.canPlayMIME(b[a].type)){f=a;break}}else if(c.canPlayURL(b[a])){f=a;break}if(b[f].url)b[f]=b[f].url;return b[f]}return b};Fa=function(b){if(!b._hasTimer)b._hasTimer=!0,!wa&&c.html5PollingInterval&&(null===O&&0===aa&&(O=J.setInterval(Ha,c.html5PollingInterval)),aa++)};Ga=function(b){if(b._hasTimer)b._hasTimer=!1,!wa&&c.html5PollingInterval&&aa--};Ha=function(){var b;if(null!==O&&!aa)return J.clearInterval(O),O=null,!1;for(b=c.soundIDs.length;b--;)c.sounds[c.soundIDs[b]].isHTML5&&c.sounds[c.soundIDs[b]]._hasTimer&&
+c.sounds[c.soundIDs[b]]._onTimer()};F=function(b){b="undefined"!==typeof b?b:{};c.onerror instanceof Function&&c.onerror.apply(j,[{type:"undefined"!==typeof b.type?b.type:null}]);"undefined"!==typeof b.fatal&&b.fatal&&c.disable()};Ka=function(){if(!xa||!da())return!1;var b=c.audioFormats,a,e;for(e in b)if(b.hasOwnProperty(e)&&("mp3"===e||"mp4"===e))if(c.html5[e]=!1,b[e]&&b[e].related)for(a=b[e].related.length;a--;)c.html5[b[e].related[a]]=!1};this._setSandboxType=function(){};this._externalInterfaceOK=
+function(){if(c.swfLoaded)return!1;(new Date).getTime();c.swfLoaded=!0;I=!1;xa&&Ka();y?setTimeout(T,100):T()};W=function(b,a){function e(a,b){return'<param name="'+a+'" value="'+b+'" />'}if(K&&L)return!1;if(c.html5Only)return ka(),c.oMC=S(c.movieID),T(),L=K=!0,!1;var f=a||c.url,d=c.altURL||f,g;g=na();var h,j,i=H(),l,m=null,m=(m=k.getElementsByTagName("html")[0])&&m.dir&&m.dir.match(/rtl/i),b="undefined"===typeof b?c.id:b;ka();c.url=Ea(za?f:d);a=c.url;c.wmode=!c.wmode&&c.useHighPerformance?"transparent":
+c.wmode;if(null!==c.wmode&&(p.match(/msie 8/i)||!y&&!c.useHighPerformance)&&navigator.platform.match(/win32|win64/i))c.wmode=null;g={name:b,id:b,src:a,width:"auto",height:"auto",quality:"high",allowScriptAccess:c.allowScriptAccess,bgcolor:c.bgColor,pluginspage:Oa+"www.macromedia.com/go/getflashplayer",title:"JS/Flash audio component (SoundManager 2)",type:"application/x-shockwave-flash",wmode:c.wmode,hasPriority:"true"};if(c.debugFlash)g.FlashVars="debug=1";c.wmode||delete g.wmode;if(y)f=k.createElement("div"),
+j=['<object id="'+b+'" data="'+a+'" type="'+g.type+'" title="'+g.title+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+Oa+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="'+g.width+'" height="'+g.height+'">',e("movie",a),e("AllowScriptAccess",c.allowScriptAccess),e("quality",g.quality),c.wmode?e("wmode",c.wmode):"",e("bgcolor",c.bgColor),e("hasPriority","true"),c.debugFlash?e("FlashVars",g.FlashVars):"","</object>"].join("");else for(h in f=
+k.createElement("embed"),g)g.hasOwnProperty(h)&&f.setAttribute(h,g[h]);oa();i=H();if(g=na())if(c.oMC=S(c.movieID)||k.createElement("div"),c.oMC.id){l=c.oMC.className;c.oMC.className=(l?l+" ":"movieContainer")+(i?" "+i:"");c.oMC.appendChild(f);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}else{c.oMC.id=c.movieID;c.oMC.className="movieContainer "+i;h=i=null;if(!c.useFlashBlock)if(c.useHighPerformance)i={position:"fixed",width:"8px",height:"8px",bottom:"0px",
+left:"0px",overflow:"hidden"};else if(i={position:"absolute",width:"6px",height:"6px",top:"-9999px",left:"-9999px"},m)i.left=Math.abs(parseInt(i.left,10))+"px";if(Ua)c.oMC.style.zIndex=1E4;if(!c.debugFlash)for(l in i)i.hasOwnProperty(l)&&(c.oMC.style[l]=i[l]);try{y||c.oMC.appendChild(f);g.appendChild(c.oMC);if(y)h=c.oMC.appendChild(k.createElement("div")),h.className="sm2-object-box",h.innerHTML=j;L=!0}catch(n){throw Error(G("domError")+" \n"+n.toString());}}return K=!0};V=function(){if(c.html5Only)return W(),
+!1;if(h)return!1;h=c.getMovie(c.id);if(!h)N?(y?c.oMC.innerHTML=pa:c.oMC.appendChild(N),N=null,K=!0):W(c.id,c.url),h=c.getMovie(c.id);c.oninitmovie instanceof Function&&setTimeout(c.oninitmovie,1);return!0};U=function(){setTimeout(Ba,1E3)};Ba=function(){if($)return!1;$=!0;n.remove(j,"load",U);if(I&&!ya)return!1;var b;m||(b=c.getMoviePercent());setTimeout(function(){b=c.getMoviePercent();!m&&Ma&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&qa():X(!0):0!==c.flashLoadTimeout&&X(!0))},
+c.flashLoadTimeout)};A=function(){function b(){n.remove(j,"focus",A);n.remove(j,"load",A)}if(ya||!I)return b(),!0;ya=Ma=!0;Q&&I&&n.remove(j,"mousemove",A);$=!1;b();return!0};La=function(){var b,a=[];if(c.useHTML5Audio&&c.hasHTML5)for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&a.push(b+": "+c.html5[b]+(!c.html5[b]&&r&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&r?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required?"required, ":"")+"and no flash support)":""))};
+M=function(b){if(m)return!1;if(c.html5Only)return m=!0,D(),!0;var a;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())m=!0,w&&(a={type:!r&&s?"NO_FLASH":"INIT_TIMEOUT"});if(w||b){if(c.useFlashBlock&&c.oMC)c.oMC.className=H()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error");C({type:"ontimeout",error:a});F(a);return!1}if(c.waitForWindowLoad&&!ia)return n.add(j,"load",D),!1;D();return!0};T=function(){if(m)return!1;if(c.html5Only){if(!m)n.remove(j,"load",c.beginDelayedInit),c.enabled=
+!0,M();return!0}V();try{h._externalInterfaceTest(!1),Ca(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||h._disableDebug(),c.enabled=!0,c.html5Only||n.add(j,"unload",ha)}catch(b){return F({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),X(!0),M(),!1}M();n.remove(j,"load",c.beginDelayedInit);return!0};E=function(){if(ma)return!1;ma=!0;oa();if(!r&&c.hasHTML5)c.useHTML5Audio=!0,c.preferFlash=!1;Ja();c.html5.usingFlash=Ia();s=c.html5.usingFlash;La();if(!r&&s)c.flashLoadTimeout=1;k.removeEventListener&&
+k.removeEventListener("DOMContentLoaded",E,!1);V();return!0};ua=function(){"complete"===k.readyState&&(E(),k.detachEvent("onreadystatechange",ua));return!0};la=function(){ia=!0;n.remove(j,"load",la)};da();n.add(j,"focus",A);n.add(j,"load",A);n.add(j,"load",U);n.add(j,"load",la);Q&&I&&n.add(j,"mousemove",A);k.addEventListener?k.addEventListener("DOMContentLoaded",E,!1):k.attachEvent?k.attachEvent("onreadystatechange",ua):F({type:"NO_DOM2_EVENTS",fatal:!0});"complete"===k.readyState&&setTimeout(E,100)}
+var ea=null;if("undefined"===typeof SM2_DEFER||!SM2_DEFER)ea=new R;J.SoundManager=R;J.soundManager=ea})(window); \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug.js b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug.js
new file mode 100755
index 0000000..ba81243
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/script/soundmanager2-nodebug.js
@@ -0,0 +1,2377 @@
+/** @license
+ *
+ * SoundManager 2: JavaScript Sound for the Web
+ * ----------------------------------------------
+ * http://schillmania.com/projects/soundmanager2/
+ *
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/soundmanager2/license.txt
+ *
+ * V2.97a.20111220
+ */
+
+/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */
+/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */
+
+(function(window) {
+var soundManager = null;
+function SoundManager(smURL, smID) {
+ this.flashVersion = 8;
+ this.debugMode = false;
+ this.debugFlash = false;
+ this.useConsole = true;
+ this.consoleOnly = true;
+ this.waitForWindowLoad = false;
+ this.bgColor = '#ffffff';
+ this.useHighPerformance = false;
+ this.flashPollingInterval = null;
+ this.html5PollingInterval = null;
+ this.flashLoadTimeout = 1000;
+ this.wmode = null;
+ this.allowScriptAccess = 'always';
+ this.useFlashBlock = false;
+ this.useHTML5Audio = true;
+ this.html5Test = /^(probably|maybe)$/i;
+ this.preferFlash = true;
+ this.noSWFCache = false;
+ this.audioFormats = {
+ 'mp3': {
+ 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
+ 'required': true
+ },
+ 'mp4': {
+ 'related': ['aac','m4a'],
+ 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
+ 'required': false
+ },
+ 'ogg': {
+ 'type': ['audio/ogg; codecs=vorbis'],
+ 'required': false
+ },
+ 'wav': {
+ 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
+ 'required': false
+ }
+ };
+ this.defaultOptions = {
+ 'autoLoad': false,
+ 'autoPlay': false,
+ 'from': null,
+ 'loops': 1,
+ 'onid3': null,
+ 'onload': null,
+ 'whileloading': null,
+ 'onplay': null,
+ 'onpause': null,
+ 'onresume': null,
+ 'whileplaying': null,
+ 'onposition': null,
+ 'onstop': null,
+ 'onfailure': null,
+ 'onfinish': null,
+ 'multiShot': true,
+ 'multiShotEvents': false,
+ 'position': null,
+ 'pan': 0,
+ 'stream': true,
+ 'to': null,
+ 'type': null,
+ 'usePolicyFile': false,
+ 'volume': 100
+ };
+ this.flash9Options = {
+ 'isMovieStar': null,
+ 'usePeakData': false,
+ 'useWaveformData': false,
+ 'useEQData': false,
+ 'onbufferchange': null,
+ 'ondataerror': null
+ };
+ this.movieStarOptions = {
+ 'bufferTime': 3,
+ 'serverURL': null,
+ 'onconnect': null,
+ 'duration': null
+ };
+ this.movieID = 'sm2-container';
+ this.id = (smID || 'sm2movie');
+ this.debugID = 'soundmanager-debug';
+ this.debugURLParam = /([#?&])debug=1/i;
+ this.versionNumber = 'V2.97a.20111220';
+ this.version = null;
+ this.movieURL = null;
+ this.url = (smURL || null);
+ this.altURL = null;
+ this.swfLoaded = false;
+ this.enabled = false;
+ this.oMC = null;
+ this.sounds = {};
+ this.soundIDs = [];
+ this.muted = false;
+ this.didFlashBlock = false;
+ this.filePattern = null;
+ this.filePatterns = {
+ 'flash8': /\.mp3(\?.*)?$/i,
+ 'flash9': /\.mp3(\?.*)?$/i
+ };
+ this.features = {
+ 'buffering': false,
+ 'peakData': false,
+ 'waveformData': false,
+ 'eqData': false,
+ 'movieStar': false
+ };
+ this.sandbox = {
+ };
+ this.hasHTML5 = (function() {
+ try {
+ return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined');
+ } catch(e) {
+ return false;
+ }
+ }());
+ this.html5 = {
+ 'usingFlash': null
+ };
+ this.flash = {};
+ this.html5Only = false;
+ this.ignoreFlash = false;
+ var SMSound,
+ _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _domContentLoaded, _winOnLoad, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _swfCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL,
+ _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport,
+ _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)),
+ _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice),
+ _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_6_([3-7])/i)),
+ _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i,
+ _emptyURL = 'about:blank',
+ _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null),
+ _http = (!_overHTTP ? 'http:/'+'/' : ''),
+ _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i,
+ _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'],
+ _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+ this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;
+ this.useAltURL = !_overHTTP;
+ this._global_a = null;
+ _swfCSS = {
+ 'swfBox': 'sm2-object-box',
+ 'swfDefault': 'movieContainer',
+ 'swfError': 'swf_error',
+ 'swfTimedout': 'swf_timedout',
+ 'swfLoaded': 'swf_loaded',
+ 'swfUnblocked': 'swf_unblocked',
+ 'sm2Debug': 'sm2_debug',
+ 'highPerf': 'high_performance',
+ 'flashDebug': 'flash_debug'
+ };
+ if (_likesHTML5) {
+ _s.useHTML5Audio = true;
+ _s.preferFlash = false;
+ if (_is_iDevice) {
+ _s.ignoreFlash = true;
+ _useGlobalHTML5Audio = true;
+ }
+ }
+ this.ok = function() {
+ return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5));
+ };
+ this.supported = this.ok;
+ this.getMovie = function(smID) {
+ return _id(smID) || _doc[smID] || _win[smID];
+ };
+ this.createSound = function(oOptions) {
+ var _cs, _cs_string,
+ thisOptions = null, oSound = null, _tO = null;
+ if (!_didInit || !_s.ok()) {
+ _complain(_cs_string);
+ return false;
+ }
+ if (arguments.length === 2) {
+ oOptions = {
+ 'id': arguments[0],
+ 'url': arguments[1]
+ };
+ }
+ thisOptions = _mixin(oOptions);
+ thisOptions.url = _parseURL(thisOptions.url);
+ _tO = thisOptions;
+ if (_idCheck(_tO.id, true)) {
+ return _s.sounds[_tO.id];
+ }
+ function make() {
+ thisOptions = _loopFix(thisOptions);
+ _s.sounds[_tO.id] = new SMSound(_tO);
+ _s.soundIDs.push(_tO.id);
+ return _s.sounds[_tO.id];
+ }
+ if (_html5OK(_tO)) {
+ oSound = make();
+ oSound._setup_html5(_tO);
+ } else {
+ if (_fV > 8) {
+ if (_tO.isMovieStar === null) {
+ _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern));
+ }
+ if (_tO.isMovieStar) {
+ if (_tO.usePeakData) {
+ _tO.usePeakData = false;
+ }
+ }
+ }
+ _tO = _policyFix(_tO, _cs);
+ oSound = make();
+ if (_fV === 8) {
+ _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile);
+ } else {
+ _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile);
+ if (!_tO.serverURL) {
+ oSound.connected = true;
+ if (_tO.onconnect) {
+ _tO.onconnect.apply(oSound);
+ }
+ }
+ }
+ if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) {
+ oSound.load(_tO);
+ }
+ }
+ if (!_tO.serverURL && _tO.autoPlay) {
+ oSound.play();
+ }
+ return oSound;
+ };
+ this.destroySound = function(sID, _bFromSound) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ var oS = _s.sounds[sID], i;
+ oS._iO = {};
+ oS.stop();
+ oS.unload();
+ for (i = 0; i < _s.soundIDs.length; i++) {
+ if (_s.soundIDs[i] === sID) {
+ _s.soundIDs.splice(i, 1);
+ break;
+ }
+ }
+ if (!_bFromSound) {
+ oS.destruct(true);
+ }
+ oS = null;
+ delete _s.sounds[sID];
+ return true;
+ };
+ this.load = function(sID, oOptions) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].load(oOptions);
+ };
+ this.unload = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].unload();
+ };
+ this.onPosition = function(sID, nPosition, oMethod, oScope) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].onposition(nPosition, oMethod, oScope);
+ };
+ this.onposition = this.onPosition;
+ this.clearOnPosition = function(sID, nPosition, oMethod) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].clearOnPosition(nPosition, oMethod);
+ };
+ this.play = function(sID, oOptions) {
+ if (!_didInit || !_s.ok()) {
+ _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK'));
+ return false;
+ }
+ if (!_idCheck(sID)) {
+ if (!(oOptions instanceof Object)) {
+ oOptions = {
+ url: oOptions
+ };
+ }
+ if (oOptions && oOptions.url) {
+ oOptions.id = sID;
+ return _s.createSound(oOptions).play();
+ } else {
+ return false;
+ }
+ }
+ return _s.sounds[sID].play(oOptions);
+ };
+ this.start = this.play;
+ this.setPosition = function(sID, nMsecOffset) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setPosition(nMsecOffset);
+ };
+ this.stop = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].stop();
+ };
+ this.stopAll = function() {
+ var oSound;
+ for (oSound in _s.sounds) {
+ if (_s.sounds.hasOwnProperty(oSound)) {
+ _s.sounds[oSound].stop();
+ }
+ }
+ };
+ this.pause = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].pause();
+ };
+ this.pauseAll = function() {
+ var i;
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].pause();
+ }
+ };
+ this.resume = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].resume();
+ };
+ this.resumeAll = function() {
+ var i;
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].resume();
+ }
+ };
+ this.togglePause = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].togglePause();
+ };
+ this.setPan = function(sID, nPan) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setPan(nPan);
+ };
+ this.setVolume = function(sID, nVol) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setVolume(nVol);
+ };
+ this.mute = function(sID) {
+ var i = 0;
+ if (typeof sID !== 'string') {
+ sID = null;
+ }
+ if (!sID) {
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].mute();
+ }
+ _s.muted = true;
+ } else {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].mute();
+ }
+ return true;
+ };
+ this.muteAll = function() {
+ _s.mute();
+ };
+ this.unmute = function(sID) {
+ var i;
+ if (typeof sID !== 'string') {
+ sID = null;
+ }
+ if (!sID) {
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].unmute();
+ }
+ _s.muted = false;
+ } else {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].unmute();
+ }
+ return true;
+ };
+ this.unmuteAll = function() {
+ _s.unmute();
+ };
+ this.toggleMute = function(sID) {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].toggleMute();
+ };
+ this.getMemoryUse = function() {
+ var ram = 0;
+ if (_flash && _fV !== 8) {
+ ram = parseInt(_flash._getMemoryUse(), 10);
+ }
+ return ram;
+ };
+ this.disable = function(bNoDisable) {
+ var i;
+ if (typeof bNoDisable === 'undefined') {
+ bNoDisable = false;
+ }
+ if (_disabled) {
+ return false;
+ }
+ _disabled = true;
+ for (i = _s.soundIDs.length; i--;) {
+ _disableObject(_s.sounds[_s.soundIDs[i]]);
+ }
+ _initComplete(bNoDisable);
+ _event.remove(_win, 'load', _initUserOnload);
+ return true;
+ };
+ this.canPlayMIME = function(sMIME) {
+ var result;
+ if (_s.hasHTML5) {
+ result = _html5CanPlay({type:sMIME});
+ }
+ if (!_needsFlash || result) {
+ return result;
+ } else {
+ return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null);
+ }
+ };
+ this.canPlayURL = function(sURL) {
+ var result;
+ if (_s.hasHTML5) {
+ result = _html5CanPlay({url: sURL});
+ }
+ if (!_needsFlash || result) {
+ return result;
+ } else {
+ return (sURL ? !!(sURL.match(_s.filePattern)) : null);
+ }
+ };
+ this.canPlayLink = function(oLink) {
+ if (typeof oLink.type !== 'undefined' && oLink.type) {
+ if (_s.canPlayMIME(oLink.type)) {
+ return true;
+ }
+ }
+ return _s.canPlayURL(oLink.href);
+ };
+ this.getSoundById = function(sID, _suppressDebug) {
+ if (!sID) {
+ throw new Error(_sm+'.getSoundById(): sID is null/undefined');
+ }
+ var result = _s.sounds[sID];
+ return result;
+ };
+ this.onready = function(oMethod, oScope) {
+ var sType = 'onready';
+ if (oMethod && oMethod instanceof Function) {
+ if (!oScope) {
+ oScope = _win;
+ }
+ _addOnEvent(sType, oMethod, oScope);
+ _processOnEvents();
+ return true;
+ } else {
+ throw _str('needFunction', sType);
+ }
+ };
+ this.ontimeout = function(oMethod, oScope) {
+ var sType = 'ontimeout';
+ if (oMethod && oMethod instanceof Function) {
+ if (!oScope) {
+ oScope = _win;
+ }
+ _addOnEvent(sType, oMethod, oScope);
+ _processOnEvents({type:sType});
+ return true;
+ } else {
+ throw _str('needFunction', sType);
+ }
+ };
+ this._writeDebug = function(sText, sType, _bTimestamp) {
+ return true;
+ };
+ this._wD = this._writeDebug;
+ this._debug = function() {
+ };
+ this.reboot = function() {
+ var i, j;
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].destruct();
+ }
+ try {
+ if (_isIE) {
+ _oRemovedHTML = _flash.innerHTML;
+ }
+ _oRemoved = _flash.parentNode.removeChild(_flash);
+ } catch(e) {
+ }
+ _oRemovedHTML = _oRemoved = _needsFlash = null;
+ _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false;
+ _s.soundIDs = _s.sounds = [];
+ _flash = null;
+ for (i in _on_queue) {
+ if (_on_queue.hasOwnProperty(i)) {
+ for (j = _on_queue[i].length; j--;) {
+ _on_queue[i][j].fired = false;
+ }
+ }
+ }
+ _win.setTimeout(_s.beginDelayedInit, 20);
+ };
+ this.getMoviePercent = function() {
+ return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null);
+ };
+ this.beginDelayedInit = function() {
+ _windowLoaded = true;
+ _domContentLoaded();
+ setTimeout(function() {
+ if (_initPending) {
+ return false;
+ }
+ _createMovie();
+ _initMovie();
+ _initPending = true;
+ return true;
+ }, 20);
+ _delayWaitForEI();
+ };
+ this.destruct = function() {
+ _s.disable(true);
+ };
+ SMSound = function(oOptions) {
+ var _t = this, _resetProperties, _add_html5_events, _remove_html5_events, _stop_html5_timer, _start_html5_timer, _attachOnPosition, _onplay_called = false, _onPositionItems = [], _onPositionFired = 0, _detachOnPosition, _applyFromTo, _lastURL = null;
+ var _lastHTML5State = {
+ duration: null,
+ time: null
+ };
+ this.sID = oOptions.id;
+ this.url = oOptions.url;
+ this.options = _mixin(oOptions);
+ this.instanceOptions = this.options;
+ this._iO = this.instanceOptions;
+ this.pan = this.options.pan;
+ this.volume = this.options.volume;
+ this.isHTML5 = false;
+ this._a = null;
+ this.id3 = {};
+ this._debug = function() {
+ };
+ this.load = function(oOptions) {
+ var oS = null, _iO;
+ if (typeof oOptions !== 'undefined') {
+ _t._iO = _mixin(oOptions, _t.options);
+ _t.instanceOptions = _t._iO;
+ } else {
+ oOptions = _t.options;
+ _t._iO = oOptions;
+ _t.instanceOptions = _t._iO;
+ if (_lastURL && _lastURL !== _t.url) {
+ _t._iO.url = _t.url;
+ _t.url = null;
+ }
+ }
+ if (!_t._iO.url) {
+ _t._iO.url = _t.url;
+ }
+ _t._iO.url = _parseURL(_t._iO.url);
+ if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) {
+ if (_t.readyState === 3 && _t._iO.onload) {
+ _t._iO.onload.apply(_t, [(!!_t.duration)]);
+ }
+ return _t;
+ }
+ _iO = _t._iO;
+ _lastURL = _t.url;
+ _t.loaded = false;
+ _t.readyState = 1;
+ _t.playState = 0;
+ if (_html5OK(_iO)) {
+ oS = _t._setup_html5(_iO);
+ if (!oS._called_load) {
+ _t._html5_canplay = false;
+ _t._a.autobuffer = 'auto';
+ _t._a.preload = 'auto';
+ oS.load();
+ oS._called_load = true;
+ if (_iO.autoPlay) {
+ _t.play();
+ }
+ } else {
+ }
+ } else {
+ try {
+ _t.isHTML5 = false;
+ _t._iO = _policyFix(_loopFix(_iO));
+ _iO = _t._iO;
+ if (_fV === 8) {
+ _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile);
+ } else {
+ _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile);
+ }
+ } catch(e) {
+ _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
+ }
+ }
+ return _t;
+ };
+ this.unload = function() {
+ if (_t.readyState !== 0) {
+ if (!_t.isHTML5) {
+ if (_fV === 8) {
+ _flash._unload(_t.sID, _emptyURL);
+ } else {
+ _flash._unload(_t.sID);
+ }
+ } else {
+ _stop_html5_timer();
+ if (_t._a) {
+ _t._a.pause();
+ _html5Unload(_t._a);
+ }
+ }
+ _resetProperties();
+ }
+ return _t;
+ };
+ this.destruct = function(_bFromSM) {
+ if (!_t.isHTML5) {
+ _t._iO.onfailure = null;
+ _flash._destroySound(_t.sID);
+ } else {
+ _stop_html5_timer();
+ if (_t._a) {
+ _t._a.pause();
+ _html5Unload(_t._a);
+ if (!_useGlobalHTML5Audio) {
+ _remove_html5_events();
+ }
+ _t._a._t = null;
+ _t._a = null;
+ }
+ }
+ if (!_bFromSM) {
+ _s.destroySound(_t.sID, true);
+ }
+ };
+ this.play = function(oOptions, _updatePlayState) {
+ var fN, allowMulti, a, onready;
+ _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState;
+ if (!oOptions) {
+ oOptions = {};
+ }
+ _t._iO = _mixin(oOptions, _t._iO);
+ _t._iO = _mixin(_t._iO, _t.options);
+ _t._iO.url = _parseURL(_t._iO.url);
+ _t.instanceOptions = _t._iO;
+ if (_t._iO.serverURL && !_t.connected) {
+ if (!_t.getAutoPlay()) {
+ _t.setAutoPlay(true);
+ }
+ return _t;
+ }
+ if (_html5OK(_t._iO)) {
+ _t._setup_html5(_t._iO);
+ _start_html5_timer();
+ }
+ if (_t.playState === 1 && !_t.paused) {
+ allowMulti = _t._iO.multiShot;
+ if (!allowMulti) {
+ return _t;
+ } else {
+ }
+ }
+ if (!_t.loaded) {
+ if (_t.readyState === 0) {
+ if (!_t.isHTML5) {
+ _t._iO.autoPlay = true;
+ }
+ _t.load(_t._iO);
+ } else if (_t.readyState === 2) {
+ return _t;
+ } else {
+ }
+ } else {
+ }
+ if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) {
+ oOptions.position = 0;
+ }
+ if (_t.paused && _t.position && _t.position > 0) {
+ _t.resume();
+ } else {
+ _t._iO = _mixin(oOptions, _t._iO);
+ if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) {
+ onready = function() {
+ _t._iO = _mixin(oOptions, _t._iO);
+ _t.play(_t._iO);
+ };
+ if (_t.isHTML5 && !_t._html5_canplay) {
+ _t.load({
+ _oncanplay: onready
+ });
+ return false;
+ } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) {
+ _t.load({
+ onload: onready
+ });
+ return false;
+ }
+ _t._iO = _applyFromTo();
+ }
+ if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) {
+ _t.instanceCount++;
+ }
+ if (_t.playState === 0 && _t._iO.onposition) {
+ _attachOnPosition(_t);
+ }
+ _t.playState = 1;
+ _t.paused = false;
+ _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0);
+ if (!_t.isHTML5) {
+ _t._iO = _policyFix(_loopFix(_t._iO));
+ }
+ if (_t._iO.onplay && _updatePlayState) {
+ _t._iO.onplay.apply(_t);
+ _onplay_called = true;
+ }
+ _t.setVolume(_t._iO.volume, true);
+ _t.setPan(_t._iO.pan, true);
+ if (!_t.isHTML5) {
+ _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000));
+ } else {
+ _start_html5_timer();
+ a = _t._setup_html5();
+ _t.setPosition(_t._iO.position);
+ a.play();
+ }
+ }
+ return _t;
+ };
+ this.start = this.play;
+ this.stop = function(bAll) {
+ var _iO = _t._iO, _oP;
+ if (_t.playState === 1) {
+ _t._onbufferchange(0);
+ _t._resetOnPosition(0);
+ _t.paused = false;
+ if (!_t.isHTML5) {
+ _t.playState = 0;
+ }
+ _detachOnPosition();
+ if (_iO.to) {
+ _t.clearOnPosition(_iO.to);
+ }
+ if (!_t.isHTML5) {
+ _flash._stop(_t.sID, bAll);
+ if (_iO.serverURL) {
+ _t.unload();
+ }
+ } else {
+ if (_t._a) {
+ _oP = _t.position;
+ _t.setPosition(0);
+ _t.position = _oP;
+ _t._a.pause();
+ _t.playState = 0;
+ _t._onTimer();
+ _stop_html5_timer();
+ }
+ }
+ _t.instanceCount = 0;
+ _t._iO = {};
+ if (_iO.onstop) {
+ _iO.onstop.apply(_t);
+ }
+ }
+ return _t;
+ };
+ this.setAutoPlay = function(autoPlay) {
+ _t._iO.autoPlay = autoPlay;
+ if (!_t.isHTML5) {
+ _flash._setAutoPlay(_t.sID, autoPlay);
+ if (autoPlay) {
+ if (!_t.instanceCount && _t.readyState === 1) {
+ _t.instanceCount++;
+ }
+ }
+ }
+ };
+ this.getAutoPlay = function() {
+ return _t._iO.autoPlay;
+ };
+ this.setPosition = function(nMsecOffset) {
+ if (nMsecOffset === undefined) {
+ nMsecOffset = 0;
+ }
+ var original_pos,
+ position, position1K,
+ offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0)));
+ original_pos = _t.position;
+ _t.position = offset;
+ position1K = _t.position/1000;
+ _t._resetOnPosition(_t.position);
+ _t._iO.position = offset;
+ if (!_t.isHTML5) {
+ position = (_fV === 9 ? _t.position : position1K);
+ if (_t.readyState && _t.readyState !== 2) {
+ _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState));
+ }
+ } else if (_t._a) {
+ if (_t._html5_canplay) {
+ if (_t._a.currentTime !== position1K) {
+ try {
+ _t._a.currentTime = position1K;
+ if (_t.playState === 0 || _t.paused) {
+ _t._a.pause();
+ }
+ } catch(e) {
+ }
+ }
+ } else {
+ }
+ }
+ if (_t.isHTML5) {
+ if (_t.paused) {
+ _t._onTimer(true);
+ }
+ }
+ return _t;
+ };
+ this.pause = function(_bCallFlash) {
+ if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) {
+ return _t;
+ }
+ _t.paused = true;
+ if (!_t.isHTML5) {
+ if (_bCallFlash || _bCallFlash === undefined) {
+ _flash._pause(_t.sID);
+ }
+ } else {
+ _t._setup_html5().pause();
+ _stop_html5_timer();
+ }
+ if (_t._iO.onpause) {
+ _t._iO.onpause.apply(_t);
+ }
+ return _t;
+ };
+ this.resume = function() {
+ var _iO = _t._iO;
+ if (!_t.paused) {
+ return _t;
+ }
+ _t.paused = false;
+ _t.playState = 1;
+ if (!_t.isHTML5) {
+ if (_iO.isMovieStar && !_iO.serverURL) {
+ _t.setPosition(_t.position);
+ }
+ _flash._pause(_t.sID);
+ } else {
+ _t._setup_html5().play();
+ _start_html5_timer();
+ }
+ if (_onplay_called && _iO.onplay) {
+ _iO.onplay.apply(_t);
+ _onplay_called = true;
+ } else if (_iO.onresume) {
+ _iO.onresume.apply(_t);
+ }
+ return _t;
+ };
+ this.togglePause = function() {
+ if (_t.playState === 0) {
+ _t.play({
+ position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000)
+ });
+ return _t;
+ }
+ if (_t.paused) {
+ _t.resume();
+ } else {
+ _t.pause();
+ }
+ return _t;
+ };
+ this.setPan = function(nPan, bInstanceOnly) {
+ if (typeof nPan === 'undefined') {
+ nPan = 0;
+ }
+ if (typeof bInstanceOnly === 'undefined') {
+ bInstanceOnly = false;
+ }
+ if (!_t.isHTML5) {
+ _flash._setPan(_t.sID, nPan);
+ }
+ _t._iO.pan = nPan;
+ if (!bInstanceOnly) {
+ _t.pan = nPan;
+ _t.options.pan = nPan;
+ }
+ return _t;
+ };
+ this.setVolume = function(nVol, _bInstanceOnly) {
+ if (typeof nVol === 'undefined') {
+ nVol = 100;
+ }
+ if (typeof _bInstanceOnly === 'undefined') {
+ _bInstanceOnly = false;
+ }
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol);
+ } else if (_t._a) {
+ _t._a.volume = Math.max(0, Math.min(1, nVol/100));
+ }
+ _t._iO.volume = nVol;
+ if (!_bInstanceOnly) {
+ _t.volume = nVol;
+ _t.options.volume = nVol;
+ }
+ return _t;
+ };
+ this.mute = function() {
+ _t.muted = true;
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, 0);
+ } else if (_t._a) {
+ _t._a.muted = true;
+ }
+ return _t;
+ };
+ this.unmute = function() {
+ _t.muted = false;
+ var hasIO = typeof _t._iO.volume !== 'undefined';
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume);
+ } else if (_t._a) {
+ _t._a.muted = false;
+ }
+ return _t;
+ };
+ this.toggleMute = function() {
+ return (_t.muted?_t.unmute():_t.mute());
+ };
+ this.onPosition = function(nPosition, oMethod, oScope) {
+ _onPositionItems.push({
+ position: nPosition,
+ method: oMethod,
+ scope: (typeof oScope !== 'undefined' ? oScope : _t),
+ fired: false
+ });
+ return _t;
+ };
+ this.onposition = this.onPosition;
+ this.clearOnPosition = function(nPosition, oMethod) {
+ var i;
+ nPosition = parseInt(nPosition, 10);
+ if (isNaN(nPosition)) {
+ return false;
+ }
+ for (i=0; i < _onPositionItems.length; i++) {
+ if (nPosition === _onPositionItems[i].position) {
+ if (!oMethod || (oMethod === _onPositionItems[i].method)) {
+ if (_onPositionItems[i].fired) {
+ _onPositionFired--;
+ }
+ _onPositionItems.splice(i, 1);
+ }
+ }
+ }
+ };
+ this._processOnPosition = function() {
+ var i, item, j = _onPositionItems.length;
+ if (!j || !_t.playState || _onPositionFired >= j) {
+ return false;
+ }
+ for (i=j; i--;) {
+ item = _onPositionItems[i];
+ if (!item.fired && _t.position >= item.position) {
+ item.fired = true;
+ _onPositionFired++;
+ item.method.apply(item.scope, [item.position]);
+ }
+ }
+ return true;
+ };
+ this._resetOnPosition = function(nPosition) {
+ var i, item, j = _onPositionItems.length;
+ if (!j) {
+ return false;
+ }
+ for (i=j; i--;) {
+ item = _onPositionItems[i];
+ if (item.fired && nPosition <= item.position) {
+ item.fired = false;
+ _onPositionFired--;
+ }
+ }
+ return true;
+ };
+ _applyFromTo = function() {
+ var _iO = _t._iO,
+ f = _iO.from,
+ t = _iO.to,
+ start, end;
+ end = function() {
+ _t.clearOnPosition(t, end);
+ _t.stop();
+ };
+ start = function() {
+ if (t !== null && !isNaN(t)) {
+ _t.onPosition(t, end);
+ }
+ };
+ if (f !== null && !isNaN(f)) {
+ _iO.position = f;
+ _iO.multiShot = false;
+ start();
+ }
+ return _iO;
+ };
+ _attachOnPosition = function() {
+ var op = _t._iO.onposition;
+ if (op) {
+ var item;
+ for (item in op) {
+ if (op.hasOwnProperty(item)) {
+ _t.onPosition(parseInt(item, 10), op[item]);
+ }
+ }
+ }
+ };
+ _detachOnPosition = function() {
+ var op = _t._iO.onposition;
+ if (op) {
+ var item;
+ for (item in op) {
+ if (op.hasOwnProperty(item)) {
+ _t.clearOnPosition(parseInt(item, 10));
+ }
+ }
+ }
+ };
+ _start_html5_timer = function() {
+ if (_t.isHTML5) {
+ _startTimer(_t);
+ }
+ };
+ _stop_html5_timer = function() {
+ if (_t.isHTML5) {
+ _stopTimer(_t);
+ }
+ };
+ _resetProperties = function() {
+ _onPositionItems = [];
+ _onPositionFired = 0;
+ _onplay_called = false;
+ _t._hasTimer = null;
+ _t._a = null;
+ _t._html5_canplay = false;
+ _t.bytesLoaded = null;
+ _t.bytesTotal = null;
+ _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null);
+ _t.durationEstimate = null;
+ _t.eqData = [];
+ _t.eqData.left = [];
+ _t.eqData.right = [];
+ _t.failures = 0;
+ _t.isBuffering = false;
+ _t.instanceOptions = {};
+ _t.instanceCount = 0;
+ _t.loaded = false;
+ _t.metadata = {};
+ _t.readyState = 0;
+ _t.muted = false;
+ _t.paused = false;
+ _t.peakData = {
+ left: 0,
+ right: 0
+ };
+ _t.waveformData = {
+ left: [],
+ right: []
+ };
+ _t.playState = 0;
+ _t.position = null;
+ };
+ _resetProperties();
+ this._onTimer = function(bForce) {
+ var duration, isNew = false, time, x = {};
+ if (_t._hasTimer || bForce) {
+ if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) {
+ duration = _t._get_html5_duration();
+ if (duration !== _lastHTML5State.duration) {
+ _lastHTML5State.duration = duration;
+ _t.duration = duration;
+ isNew = true;
+ }
+ _t.durationEstimate = _t.duration;
+ time = (_t._a.currentTime * 1000 || 0);
+ if (time !== _lastHTML5State.time) {
+ _lastHTML5State.time = time;
+ isNew = true;
+ }
+ if (isNew || bForce) {
+ _t._whileplaying(time,x,x,x,x);
+ }
+ return isNew;
+ } else {
+ return false;
+ }
+ }
+ };
+ this._get_html5_duration = function() {
+ var _iO = _t._iO,
+ d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)),
+ result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null));
+ return result;
+ };
+ this._setup_html5 = function(oOptions) {
+ var _iO = _mixin(_t._iO, oOptions), d = decodeURI,
+ _a = _useGlobalHTML5Audio ? _s._global_a : _t._a,
+ _dURL = d(_iO.url),
+ _oldIO = (_a && _a._t ? _a._t.instanceOptions : null);
+ if (_a) {
+ if (_a._t) {
+ if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) {
+ return _a;
+ } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) {
+ return _a;
+ }
+ }
+ if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) {
+ _a._t.stop();
+ }
+ _resetProperties();
+ _a.src = _iO.url;
+ _t.url = _iO.url;
+ _lastURL = _iO.url;
+ _a._called_load = false;
+ } else {
+ _a = new Audio(_iO.url);
+ _a._called_load = false;
+ if (_is_android) {
+ _a._called_load = true;
+ }
+ if (_useGlobalHTML5Audio) {
+ _s._global_a = _a;
+ }
+ }
+ _t.isHTML5 = true;
+ _t._a = _a;
+ _a._t = _t;
+ _add_html5_events();
+ _a.loop = (_iO.loops>1?'loop':'');
+ if (_iO.autoLoad || _iO.autoPlay) {
+ _t.load();
+ } else {
+ _a.autobuffer = false;
+ _a.preload = 'none';
+ }
+ _a.loop = (_iO.loops > 1 ? 'loop' : '');
+ return _a;
+ };
+ _add_html5_events = function() {
+ if (_t._a._added_events) {
+ return false;
+ }
+ var f;
+ function add(oEvt, oFn, bCapture) {
+ return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null;
+ }
+ _t._a._added_events = true;
+ for (f in _html5_events) {
+ if (_html5_events.hasOwnProperty(f)) {
+ add(f, _html5_events[f]);
+ }
+ }
+ return true;
+ };
+ _remove_html5_events = function() {
+ var f;
+ function remove(oEvt, oFn, bCapture) {
+ return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
+ }
+ _t._a._added_events = false;
+ for (f in _html5_events) {
+ if (_html5_events.hasOwnProperty(f)) {
+ remove(f, _html5_events[f]);
+ }
+ }
+ };
+ this._onload = function(nSuccess) {
+ var fN, loadOK = !!(nSuccess);
+ _t.loaded = loadOK;
+ _t.readyState = loadOK?3:2;
+ _t._onbufferchange(0);
+ if (_t._iO.onload) {
+ _t._iO.onload.apply(_t, [loadOK]);
+ }
+ return true;
+ };
+ this._onbufferchange = function(nIsBuffering) {
+ if (_t.playState === 0) {
+ return false;
+ }
+ if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) {
+ return false;
+ }
+ _t.isBuffering = (nIsBuffering === 1);
+ if (_t._iO.onbufferchange) {
+ _t._iO.onbufferchange.apply(_t);
+ }
+ return true;
+ };
+ this._onsuspend = function() {
+ if (_t._iO.onsuspend) {
+ _t._iO.onsuspend.apply(_t);
+ }
+ return true;
+ };
+ this._onfailure = function(msg, level, code) {
+ _t.failures++;
+ if (_t._iO.onfailure && _t.failures === 1) {
+ _t._iO.onfailure(_t, msg, level, code);
+ } else {
+ }
+ };
+ this._onfinish = function() {
+ var _io_onfinish = _t._iO.onfinish;
+ _t._onbufferchange(0);
+ _t._resetOnPosition(0);
+ if (_t.instanceCount) {
+ _t.instanceCount--;
+ if (!_t.instanceCount) {
+ _detachOnPosition();
+ _t.playState = 0;
+ _t.paused = false;
+ _t.instanceCount = 0;
+ _t.instanceOptions = {};
+ _t._iO = {};
+ _stop_html5_timer();
+ }
+ if (!_t.instanceCount || _t._iO.multiShotEvents) {
+ if (_io_onfinish) {
+ _io_onfinish.apply(_t);
+ }
+ }
+ }
+ };
+ this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
+ var _iO = _t._iO;
+ _t.bytesLoaded = nBytesLoaded;
+ _t.bytesTotal = nBytesTotal;
+ _t.duration = Math.floor(nDuration);
+ _t.bufferLength = nBufferLength;
+ if (!_iO.isMovieStar) {
+ if (_iO.duration) {
+ _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration;
+ } else {
+ _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10);
+ }
+ if (_t.durationEstimate === undefined) {
+ _t.durationEstimate = _t.duration;
+ }
+ if (_t.readyState !== 3 && _iO.whileloading) {
+ _iO.whileloading.apply(_t);
+ }
+ } else {
+ _t.durationEstimate = _t.duration;
+ if (_t.readyState !== 3 && _iO.whileloading) {
+ _iO.whileloading.apply(_t);
+ }
+ }
+ };
+ this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
+ var _iO = _t._iO;
+ if (isNaN(nPosition) || nPosition === null) {
+ return false;
+ }
+ _t.position = nPosition;
+ _t._processOnPosition();
+ if (!_t.isHTML5 && _fV > 8) {
+ if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) {
+ _t.peakData = {
+ left: oPeakData.leftPeak,
+ right: oPeakData.rightPeak
+ };
+ }
+ if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) {
+ _t.waveformData = {
+ left: oWaveformDataLeft.split(','),
+ right: oWaveformDataRight.split(',')
+ };
+ }
+ if (_iO.useEQData) {
+ if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) {
+ var eqLeft = oEQData.leftEQ.split(',');
+ _t.eqData = eqLeft;
+ _t.eqData.left = eqLeft;
+ if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) {
+ _t.eqData.right = oEQData.rightEQ.split(',');
+ }
+ }
+ }
+ }
+ if (_t.playState === 1) {
+ if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) {
+ _t._onbufferchange(0);
+ }
+ if (_iO.whileplaying) {
+ _iO.whileplaying.apply(_t);
+ }
+ }
+ return true;
+ };
+ this._onmetadata = function(oMDProps, oMDData) {
+ var oData = {}, i, j;
+ for (i = 0, j = oMDProps.length; i < j; i++) {
+ oData[oMDProps[i]] = oMDData[i];
+ }
+ _t.metadata = oData;
+ if (_t._iO.onmetadata) {
+ _t._iO.onmetadata.apply(_t);
+ }
+ };
+ this._onid3 = function(oID3Props, oID3Data) {
+ var oData = [], i, j;
+ for (i = 0, j = oID3Props.length; i < j; i++) {
+ oData[oID3Props[i]] = oID3Data[i];
+ }
+ _t.id3 = _mixin(_t.id3, oData);
+ if (_t._iO.onid3) {
+ _t._iO.onid3.apply(_t);
+ }
+ };
+ this._onconnect = function(bSuccess) {
+ bSuccess = (bSuccess === 1);
+ _t.connected = bSuccess;
+ if (bSuccess) {
+ _t.failures = 0;
+ if (_idCheck(_t.sID)) {
+ if (_t.getAutoPlay()) {
+ _t.play(undefined, _t.getAutoPlay());
+ } else if (_t._iO.autoLoad) {
+ _t.load();
+ }
+ }
+ if (_t._iO.onconnect) {
+ _t._iO.onconnect.apply(_t, [bSuccess]);
+ }
+ }
+ };
+ this._ondataerror = function(sError) {
+ if (_t.playState > 0) {
+ if (_t._iO.ondataerror) {
+ _t._iO.ondataerror.apply(_t);
+ }
+ }
+ };
+ };
+ _getDocument = function() {
+ return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]);
+ };
+ _id = function(sID) {
+ return _doc.getElementById(sID);
+ };
+ _mixin = function(oMain, oAdd) {
+ var o1 = {}, i, o2, o;
+ for (i in oMain) {
+ if (oMain.hasOwnProperty(i)) {
+ o1[i] = oMain[i];
+ }
+ }
+ o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd);
+ for (o in o2) {
+ if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') {
+ o1[o] = o2[o];
+ }
+ }
+ return o1;
+ };
+ _event = (function() {
+ var old = (_win.attachEvent),
+ evt = {
+ add: (old?'attachEvent':'addEventListener'),
+ remove: (old?'detachEvent':'removeEventListener')
+ };
+ function getArgs(oArgs) {
+ var args = _slice.call(oArgs), len = args.length;
+ if (old) {
+ args[1] = 'on' + args[1];
+ if (len > 3) {
+ args.pop();
+ }
+ } else if (len === 3) {
+ args.push(false);
+ }
+ return args;
+ }
+ function apply(args, sType) {
+ var element = args.shift(),
+ method = [evt[sType]];
+ if (old) {
+ element[method](args[0], args[1]);
+ } else {
+ element[method].apply(element, args);
+ }
+ }
+ function add() {
+ apply(getArgs(arguments), 'add');
+ }
+ function remove() {
+ apply(getArgs(arguments), 'remove');
+ }
+ return {
+ 'add': add,
+ 'remove': remove
+ };
+ }());
+ function _html5_event(oFn) {
+ return function(e) {
+ var t = this._t;
+ if (!t || !t._a) {
+ return null;
+ } else {
+ return oFn.call(this, e);
+ }
+ };
+ }
+ _html5_events = {
+ abort: _html5_event(function(e) {
+ }),
+ canplay: _html5_event(function(e) {
+ var t = this._t;
+ if (t._html5_canplay) {
+ return true;
+ }
+ t._html5_canplay = true;
+ t._onbufferchange(0);
+ var position1K = (!isNaN(t.position)?t.position/1000:null);
+ if (t.position && this.currentTime !== position1K) {
+ try {
+ this.currentTime = position1K;
+ } catch(ee) {
+ }
+ }
+ if (t._iO._oncanplay) {
+ t._iO._oncanplay();
+ }
+ }),
+ load: _html5_event(function(e) {
+ var t = this._t;
+ if (!t.loaded) {
+ t._onbufferchange(0);
+ t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration());
+ t._onload(true);
+ }
+ }),
+ emptied: _html5_event(function(e) {
+ }),
+ ended: _html5_event(function(e) {
+ var t = this._t;
+ t._onfinish();
+ }),
+ error: _html5_event(function(e) {
+ this._t._onload(false);
+ }),
+ loadeddata: _html5_event(function(e) {
+ var t = this._t,
+ bytesTotal = t.bytesTotal || 1;
+ if (!t._loaded && !_isSafari) {
+ t.duration = t._get_html5_duration();
+ t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration());
+ t._onload(true);
+ }
+ }),
+ loadedmetadata: _html5_event(function(e) {
+ }),
+ loadstart: _html5_event(function(e) {
+ this._t._onbufferchange(1);
+ }),
+ play: _html5_event(function(e) {
+ this._t._onbufferchange(0);
+ }),
+ playing: _html5_event(function(e) {
+ this._t._onbufferchange(0);
+ }),
+ progress: _html5_event(function(e) {
+ var t = this._t;
+ if (t.loaded) {
+ return false;
+ }
+ var i, j, str, buffered = 0,
+ isProgress = (e.type === 'progress'),
+ ranges = e.target.buffered,
+ loaded = (e.loaded||0),
+ total = (e.total||1);
+ if (ranges && ranges.length) {
+ for (i=ranges.length; i--;) {
+ buffered = (ranges.end(i) - ranges.start(i));
+ }
+ loaded = buffered/e.target.duration;
+ }
+ if (!isNaN(loaded)) {
+ t._onbufferchange(0);
+ t._whileloading(loaded, total, t._get_html5_duration());
+ if (loaded && total && loaded === total) {
+ _html5_events.load.call(this, e);
+ }
+ }
+ }),
+ ratechange: _html5_event(function(e) {
+ }),
+ suspend: _html5_event(function(e) {
+ var t = this._t;
+ _html5_events.progress.call(this, e);
+ t._onsuspend();
+ }),
+ stalled: _html5_event(function(e) {
+ }),
+ timeupdate: _html5_event(function(e) {
+ this._t._onTimer();
+ }),
+ waiting: _html5_event(function(e) {
+ var t = this._t;
+ t._onbufferchange(1);
+ })
+ };
+ _html5OK = function(iO) {
+ return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only));
+ };
+ _html5Unload = function(oAudio) {
+ if (oAudio) {
+ oAudio.src = (_is_firefox ? '' : _emptyURL);
+ }
+ };
+ _html5CanPlay = function(o) {
+ if (!_s.useHTML5Audio || !_s.hasHTML5) {
+ return false;
+ }
+ var url = (o.url || null),
+ mime = (o.type || null),
+ aF = _s.audioFormats,
+ result,
+ offset,
+ fileExt,
+ item;
+ function preferFlashCheck(kind) {
+ return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind]));
+ }
+ if (mime && _s.html5[mime] !== 'undefined') {
+ return (_s.html5[mime] && !preferFlashCheck(mime));
+ }
+ if (!_html5Ext) {
+ _html5Ext = [];
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ _html5Ext.push(item);
+ if (aF[item].related) {
+ _html5Ext = _html5Ext.concat(aF[item].related);
+ }
+ }
+ }
+ _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i');
+ }
+ fileExt = (url ? url.toLowerCase().match(_html5Ext) : null);
+ if (!fileExt || !fileExt.length) {
+ if (!mime) {
+ return false;
+ } else {
+ offset = mime.indexOf(';');
+ fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6);
+ }
+ } else {
+ fileExt = fileExt[1];
+ }
+ if (fileExt && typeof _s.html5[fileExt] !== 'undefined') {
+ return (_s.html5[fileExt] && !preferFlashCheck(fileExt));
+ } else {
+ mime = 'audio/'+fileExt;
+ result = _s.html5.canPlayType({type:mime});
+ _s.html5[fileExt] = result;
+ return (result && _s.html5[mime] && !preferFlashCheck(mime));
+ }
+ };
+ _testHTML5 = function() {
+ if (!_s.useHTML5Audio || typeof Audio === 'undefined') {
+ return false;
+ }
+ var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null),
+ item, support = {}, aF, i;
+ function _cp(m) {
+ var canPlay, i, j, isOK = false;
+ if (!a || typeof a.canPlayType !== 'function') {
+ return false;
+ }
+ if (m instanceof Array) {
+ for (i=0, j=m.length; i<j && !isOK; i++) {
+ if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) {
+ isOK = true;
+ _s.html5[m[i]] = true;
+ _s.flash[m[i]] = !!(_s.preferFlash && _hasFlash && m[i].match(_flashMIME));
+ }
+ }
+ return isOK;
+ } else {
+ canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
+ return !!(canPlay && (canPlay.match(_s.html5Test)));
+ }
+ }
+ aF = _s.audioFormats;
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ support[item] = _cp(aF[item].type);
+ support['audio/'+item] = support[item];
+ if (_s.preferFlash && !_s.ignoreFlash && item.match(_flashMIME)) {
+ _s.flash[item] = true;
+ } else {
+ _s.flash[item] = false;
+ }
+ if (aF[item] && aF[item].related) {
+ for (i=aF[item].related.length; i--;) {
+ support['audio/'+aF[item].related[i]] = support[item];
+ _s.html5[aF[item].related[i]] = support[item];
+ _s.flash[aF[item].related[i]] = support[item];
+ }
+ }
+ }
+ }
+ support.canPlayType = (a?_cp:null);
+ _s.html5 = _mixin(_s.html5, support);
+ return true;
+ };
+ _strings = {
+ };
+ _str = function() {
+ };
+ _loopFix = function(sOpt) {
+ if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) {
+ sOpt.stream = false;
+ }
+ return sOpt;
+ };
+ _policyFix = function(sOpt, sPre) {
+ if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
+ sOpt.usePolicyFile = true;
+ }
+ return sOpt;
+ };
+ _complain = function(sMsg) {
+ };
+ _doNothing = function() {
+ return false;
+ };
+ _disableObject = function(o) {
+ var oProp;
+ for (oProp in o) {
+ if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
+ o[oProp] = _doNothing;
+ }
+ }
+ oProp = null;
+ };
+ _failSafely = function(bNoDisable) {
+ if (typeof bNoDisable === 'undefined') {
+ bNoDisable = false;
+ }
+ if (_disabled || bNoDisable) {
+ _s.disable(bNoDisable);
+ }
+ };
+ _normalizeMovieURL = function(smURL) {
+ var urlParams = null, url;
+ if (smURL) {
+ if (smURL.match(/\.swf(\?.*)?$/i)) {
+ urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
+ if (urlParams) {
+ return smURL;
+ }
+ } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
+ smURL += '/';
+ }
+ }
+ url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL;
+ if (_s.noSWFCache) {
+ url += ('?ts=' + new Date().getTime());
+ }
+ return url;
+ };
+ _setVersionInfo = function() {
+ _fV = parseInt(_s.flashVersion, 10);
+ if (_fV !== 8 && _fV !== 9) {
+ _s.flashVersion = _fV = _defaultFlashVersion;
+ }
+ var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf');
+ if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) {
+ _s.flashVersion = _fV = 9;
+ }
+ _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
+ if (_fV > 8) {
+ _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options);
+ _s.features.buffering = true;
+ _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions);
+ _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+ _s.features.movieStar = true;
+ } else {
+ _s.features.movieStar = false;
+ }
+ _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')];
+ _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug);
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8);
+ };
+ _setPolling = function(bPolling, bHighPerformance) {
+ if (!_flash) {
+ return false;
+ }
+ _flash._setPolling(bPolling, bHighPerformance);
+ };
+ _initDebug = function() {
+ if (_s.debugURLParam.test(_wl)) {
+ _s.debugMode = true;
+ }
+ };
+ _idCheck = this.getSoundById;
+ _getSWFCSS = function() {
+ var css = [];
+ if (_s.debugMode) {
+ css.push(_swfCSS.sm2Debug);
+ }
+ if (_s.debugFlash) {
+ css.push(_swfCSS.flashDebug);
+ }
+ if (_s.useHighPerformance) {
+ css.push(_swfCSS.highPerf);
+ }
+ return css.join(' ');
+ };
+ _flashBlockHandler = function() {
+ var name = _str('fbHandler'),
+ p = _s.getMoviePercent(),
+ css = _swfCSS,
+ error = {type:'FLASHBLOCK'};
+ if (_s.html5Only) {
+ return false;
+ }
+ if (!_s.ok()) {
+ if (_needsFlash) {
+ _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
+ }
+ _s.didFlashBlock = true;
+ _processOnEvents({type:'ontimeout', ignoreInit:true, error:error});
+ _catchError(error);
+ } else {
+ if (_s.oMC) {
+ _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
+ }
+ }
+ };
+ _addOnEvent = function(sType, oMethod, oScope) {
+ if (typeof _on_queue[sType] === 'undefined') {
+ _on_queue[sType] = [];
+ }
+ _on_queue[sType].push({
+ 'method': oMethod,
+ 'scope': (oScope || null),
+ 'fired': false
+ });
+ };
+ _processOnEvents = function(oOptions) {
+ if (!oOptions) {
+ oOptions = {
+ type: 'onready'
+ };
+ }
+ if (!_didInit && oOptions && !oOptions.ignoreInit) {
+ return false;
+ }
+ if (oOptions.type === 'ontimeout' && _s.ok()) {
+ return false;
+ }
+ var status = {
+ success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled)
+ },
+ srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]),
+ queue = [], i, j,
+ args = [status],
+ canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok());
+ if (oOptions.error) {
+ args[0].error = oOptions.error;
+ }
+ for (i = 0, j = srcQueue.length; i < j; i++) {
+ if (srcQueue[i].fired !== true) {
+ queue.push(srcQueue[i]);
+ }
+ }
+ if (queue.length) {
+ for (i = 0, j = queue.length; i < j; i++) {
+ if (queue[i].scope) {
+ queue[i].method.apply(queue[i].scope, args);
+ } else {
+ queue[i].method.apply(this, args);
+ }
+ if (!canRetry) {
+ queue[i].fired = true;
+ }
+ }
+ }
+ return true;
+ };
+ _initUserOnload = function() {
+ _win.setTimeout(function() {
+ if (_s.useFlashBlock) {
+ _flashBlockHandler();
+ }
+ _processOnEvents();
+ if (_s.onload instanceof Function) {
+ _s.onload.apply(_win);
+ }
+ if (_s.waitForWindowLoad) {
+ _event.add(_win, 'load', _initUserOnload);
+ }
+ },1);
+ };
+ _detectFlash = function() {
+ if (_hasFlash !== undefined) {
+ return _hasFlash;
+ }
+ var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject;
+ if (nP && nP.length) {
+ type = 'application/x-shockwave-flash';
+ types = n.mimeTypes;
+ if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
+ hasPlugin = true;
+ }
+ } else if (typeof AX !== 'undefined') {
+ try {
+ obj = new AX('ShockwaveFlash.ShockwaveFlash');
+ } catch(e) {
+ }
+ hasPlugin = (!!obj);
+ }
+ _hasFlash = hasPlugin;
+ return hasPlugin;
+ };
+ _featureCheck = function() {
+ var needsFlash, item,
+ isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i)));
+ if (isSpecial) {
+ _s.hasHTML5 = false;
+ _s.html5Only = true;
+ if (_s.oMC) {
+ _s.oMC.style.display = 'none';
+ }
+ return false;
+ }
+ if (_s.useHTML5Audio) {
+ if (!_s.html5 || !_s.html5.canPlayType) {
+ _s.hasHTML5 = false;
+ return true;
+ } else {
+ _s.hasHTML5 = true;
+ }
+ if (_isBadSafari) {
+ if (_detectFlash()) {
+ return true;
+ }
+ }
+ } else {
+ return true;
+ }
+ for (item in _s.audioFormats) {
+ if (_s.audioFormats.hasOwnProperty(item)) {
+ if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) {
+ needsFlash = true;
+ }
+ }
+ }
+ if (_s.ignoreFlash) {
+ needsFlash = false;
+ }
+ _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash);
+ return (!_s.html5Only);
+ };
+ _parseURL = function(url) {
+ var i, j, result = 0;
+ if (url instanceof Array) {
+ for (i=0, j=url.length; i<j; i++) {
+ if (url[i] instanceof Object) {
+ if (_s.canPlayMIME(url[i].type)) {
+ result = i;
+ break;
+ }
+ } else if (_s.canPlayURL(url[i])) {
+ result = i;
+ break;
+ }
+ }
+ if (url[result].url) {
+ url[result] = url[result].url;
+ }
+ return url[result];
+ } else {
+ return url;
+ }
+ };
+ _startTimer = function(oSound) {
+ if (!oSound._hasTimer) {
+ oSound._hasTimer = true;
+ if (!_likesHTML5 && _s.html5PollingInterval) {
+ if (_h5IntervalTimer === null && _h5TimerCount === 0) {
+ _h5IntervalTimer = window.setInterval(_timerExecute, _s.html5PollingInterval);
+ }
+ _h5TimerCount++;
+ }
+ }
+ };
+ _stopTimer = function(oSound) {
+ if (oSound._hasTimer) {
+ oSound._hasTimer = false;
+ if (!_likesHTML5 && _s.html5PollingInterval) {
+ _h5TimerCount--;
+ }
+ }
+ };
+ _timerExecute = function() {
+ var i, j;
+ if (_h5IntervalTimer !== null && !_h5TimerCount) {
+ window.clearInterval(_h5IntervalTimer);
+ _h5IntervalTimer = null;
+ return false;
+ }
+ for (i = _s.soundIDs.length; i--;) {
+ if (_s.sounds[_s.soundIDs[i]].isHTML5 && _s.sounds[_s.soundIDs[i]]._hasTimer) {
+ _s.sounds[_s.soundIDs[i]]._onTimer();
+ }
+ }
+ };
+ _catchError = function(options) {
+ options = (typeof options !== 'undefined' ? options : {});
+ if (_s.onerror instanceof Function) {
+ _s.onerror.apply(_win, [{type:(typeof options.type !== 'undefined' ? options.type : null)}]);
+ }
+ if (typeof options.fatal !== 'undefined' && options.fatal) {
+ _s.disable();
+ }
+ };
+ _badSafariFix = function() {
+ if (!_isBadSafari || !_detectFlash()) {
+ return false;
+ }
+ var aF = _s.audioFormats, i, item;
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ if (item === 'mp3' || item === 'mp4') {
+ _s.html5[item] = false;
+ if (aF[item] && aF[item].related) {
+ for (i = aF[item].related.length; i--;) {
+ _s.html5[aF[item].related[i]] = false;
+ }
+ }
+ }
+ }
+ }
+ };
+ this._setSandboxType = function(sandboxType) {
+ };
+ this._externalInterfaceOK = function(flashDate, swfVersion) {
+ if (_s.swfLoaded) {
+ return false;
+ }
+ var e, eiTime = new Date().getTime();
+ _s.swfLoaded = true;
+ _tryInitOnFocus = false;
+ if (_isBadSafari) {
+ _badSafariFix();
+ }
+ if (_isIE) {
+ setTimeout(_init, 100);
+ } else {
+ _init();
+ }
+ };
+ _createMovie = function(smID, smURL) {
+ if (_didAppend && _appendSuccess) {
+ return false;
+ }
+ function _initMsg() {
+ }
+ if (_s.html5Only) {
+ _setVersionInfo();
+ _initMsg();
+ _s.oMC = _id(_s.movieID);
+ _init();
+ _didAppend = true;
+ _appendSuccess = true;
+ return false;
+ }
+ var remoteURL = (smURL || _s.url),
+ localURL = (_s.altURL || remoteURL),
+ swfTitle = 'JS/Flash audio component (SoundManager 2)',
+ oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(),
+ s, x, sClass, side = 'auto', isRTL = null,
+ html = _doc.getElementsByTagName('html')[0];
+ isRTL = (html && html.dir && html.dir.match(/rtl/i));
+ smID = (typeof smID === 'undefined'?_s.id:smID);
+ function param(name, value) {
+ return '<param name="'+name+'" value="'+value+'" />';
+ }
+ _setVersionInfo();
+ _s.url = _normalizeMovieURL(_overHTTP?remoteURL:localURL);
+ smURL = _s.url;
+ _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode);
+ if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
+ _s.wmode = null;
+ }
+ oEmbed = {
+ 'name': smID,
+ 'id': smID,
+ 'src': smURL,
+ 'width': side,
+ 'height': side,
+ 'quality': 'high',
+ 'allowScriptAccess': _s.allowScriptAccess,
+ 'bgcolor': _s.bgColor,
+ 'pluginspage': _http+'www.macromedia.com/go/getflashplayer',
+ 'title': swfTitle,
+ 'type': 'application/x-shockwave-flash',
+ 'wmode': _s.wmode,
+ 'hasPriority': 'true'
+ };
+ if (_s.debugFlash) {
+ oEmbed.FlashVars = 'debug=1';
+ }
+ if (!_s.wmode) {
+ delete oEmbed.wmode;
+ }
+ if (_isIE) {
+ oMovie = _doc.createElement('div');
+ movieHTML = [
+ '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + _http+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' + oEmbed.width + '" height="' + oEmbed.height + '">',
+ param('movie', smURL),
+ param('AllowScriptAccess', _s.allowScriptAccess),
+ param('quality', oEmbed.quality),
+ (_s.wmode? param('wmode', _s.wmode): ''),
+ param('bgcolor', _s.bgColor),
+ param('hasPriority', 'true'),
+ (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
+ '</object>'
+ ].join('');
+ } else {
+ oMovie = _doc.createElement('embed');
+ for (tmp in oEmbed) {
+ if (oEmbed.hasOwnProperty(tmp)) {
+ oMovie.setAttribute(tmp, oEmbed[tmp]);
+ }
+ }
+ }
+ _initDebug();
+ extraClass = _getSWFCSS();
+ oTarget = _getDocument();
+ if (oTarget) {
+ _s.oMC = (_id(_s.movieID) || _doc.createElement('div'));
+ if (!_s.oMC.id) {
+ _s.oMC.id = _s.movieID;
+ _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass;
+ s = null;
+ oEl = null;
+ if (!_s.useFlashBlock) {
+ if (_s.useHighPerformance) {
+ s = {
+ 'position': 'fixed',
+ 'width': '8px',
+ 'height': '8px',
+ 'bottom': '0px',
+ 'left': '0px',
+ 'overflow': 'hidden'
+ };
+ } else {
+ s = {
+ 'position': 'absolute',
+ 'width': '6px',
+ 'height': '6px',
+ 'top': '-9999px',
+ 'left': '-9999px'
+ };
+ if (isRTL) {
+ s.left = Math.abs(parseInt(s.left,10))+'px';
+ }
+ }
+ }
+ if (_isWebkit) {
+ _s.oMC.style.zIndex = 10000;
+ }
+ if (!_s.debugFlash) {
+ for (x in s) {
+ if (s.hasOwnProperty(x)) {
+ _s.oMC.style[x] = s[x];
+ }
+ }
+ }
+ try {
+ if (!_isIE) {
+ _s.oMC.appendChild(oMovie);
+ }
+ oTarget.appendChild(_s.oMC);
+ if (_isIE) {
+ oEl = _s.oMC.appendChild(_doc.createElement('div'));
+ oEl.className = _swfCSS.swfBox;
+ oEl.innerHTML = movieHTML;
+ }
+ _appendSuccess = true;
+ } catch(e) {
+ throw new Error(_str('domError')+' \n'+e.toString());
+ }
+ } else {
+ sClass = _s.oMC.className;
+ _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
+ _s.oMC.appendChild(oMovie);
+ if (_isIE) {
+ oEl = _s.oMC.appendChild(_doc.createElement('div'));
+ oEl.className = _swfCSS.swfBox;
+ oEl.innerHTML = movieHTML;
+ }
+ _appendSuccess = true;
+ }
+ }
+ _didAppend = true;
+ _initMsg();
+ return true;
+ };
+ _initMovie = function() {
+ if (_s.html5Only) {
+ _createMovie();
+ return false;
+ }
+ if (_flash) {
+ return false;
+ }
+ _flash = _s.getMovie(_s.id);
+ if (!_flash) {
+ if (!_oRemoved) {
+ _createMovie(_s.id, _s.url);
+ } else {
+ if (!_isIE) {
+ _s.oMC.appendChild(_oRemoved);
+ } else {
+ _s.oMC.innerHTML = _oRemovedHTML;
+ }
+ _oRemoved = null;
+ _didAppend = true;
+ }
+ _flash = _s.getMovie(_s.id);
+ }
+ if (_s.oninitmovie instanceof Function) {
+ setTimeout(_s.oninitmovie, 1);
+ }
+ return true;
+ };
+ _delayWaitForEI = function() {
+ setTimeout(_waitForEI, 1000);
+ };
+ _waitForEI = function() {
+ if (_waitingForEI) {
+ return false;
+ }
+ _waitingForEI = true;
+ _event.remove(_win, 'load', _delayWaitForEI);
+ if (_tryInitOnFocus && !_isFocused) {
+ return false;
+ }
+ var p;
+ if (!_didInit) {
+ p = _s.getMoviePercent();
+ }
+ setTimeout(function() {
+ p = _s.getMoviePercent();
+ if (!_didInit && _okToDisable) {
+ if (p === null) {
+ if (_s.useFlashBlock || _s.flashLoadTimeout === 0) {
+ if (_s.useFlashBlock) {
+ _flashBlockHandler();
+ }
+ } else {
+ _failSafely(true);
+ }
+ } else {
+ if (_s.flashLoadTimeout === 0) {
+ } else {
+ _failSafely(true);
+ }
+ }
+ }
+ }, _s.flashLoadTimeout);
+ };
+ _handleFocus = function() {
+ function cleanup() {
+ _event.remove(_win, 'focus', _handleFocus);
+ _event.remove(_win, 'load', _handleFocus);
+ }
+ if (_isFocused || !_tryInitOnFocus) {
+ cleanup();
+ return true;
+ }
+ _okToDisable = true;
+ _isFocused = true;
+ if (_isSafari && _tryInitOnFocus) {
+ _event.remove(_win, 'mousemove', _handleFocus);
+ }
+ _waitingForEI = false;
+ cleanup();
+ return true;
+ };
+ _showSupport = function() {
+ var item, tests = [];
+ if (_s.useHTML5Audio && _s.hasHTML5) {
+ for (item in _s.audioFormats) {
+ if (_s.audioFormats.hasOwnProperty(item)) {
+ tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
+ }
+ }
+ }
+ };
+ _initComplete = function(bNoDisable) {
+ if (_didInit) {
+ return false;
+ }
+ if (_s.html5Only) {
+ _didInit = true;
+ _initUserOnload();
+ return true;
+ }
+ var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()),
+ error;
+ if (!wasTimeout) {
+ _didInit = true;
+ if (_disabled) {
+ error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
+ }
+ }
+ if (_disabled || bNoDisable) {
+ if (_s.useFlashBlock && _s.oMC) {
+ _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError);
+ }
+ _processOnEvents({type:'ontimeout', error:error});
+ _catchError(error);
+ return false;
+ } else {
+ }
+ if (_s.waitForWindowLoad && !_windowLoaded) {
+ _event.add(_win, 'load', _initUserOnload);
+ return false;
+ } else {
+ _initUserOnload();
+ }
+ return true;
+ };
+ _init = function() {
+ if (_didInit) {
+ return false;
+ }
+ function _cleanup() {
+ _event.remove(_win, 'load', _s.beginDelayedInit);
+ }
+ if (_s.html5Only) {
+ if (!_didInit) {
+ _cleanup();
+ _s.enabled = true;
+ _initComplete();
+ }
+ return true;
+ }
+ _initMovie();
+ try {
+ _flash._externalInterfaceTest(false);
+ _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50)));
+ if (!_s.debugMode) {
+ _flash._disableDebug();
+ }
+ _s.enabled = true;
+ if (!_s.html5Only) {
+ _event.add(_win, 'unload', _doNothing);
+ }
+ } catch(e) {
+ _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
+ _failSafely(true);
+ _initComplete();
+ return false;
+ }
+ _initComplete();
+ _cleanup();
+ return true;
+ };
+ _domContentLoaded = function() {
+ if (_didDCLoaded) {
+ return false;
+ }
+ _didDCLoaded = true;
+ _initDebug();
+ if (!_hasFlash && _s.hasHTML5) {
+ _s.useHTML5Audio = true;
+ _s.preferFlash = false;
+ }
+ _testHTML5();
+ _s.html5.usingFlash = _featureCheck();
+ _needsFlash = _s.html5.usingFlash;
+ _showSupport();
+ if (!_hasFlash && _needsFlash) {
+ _s.flashLoadTimeout = 1;
+ }
+ if (_doc.removeEventListener) {
+ _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false);
+ }
+ _initMovie();
+ return true;
+ };
+ _domContentLoadedIE = function() {
+ if (_doc.readyState === 'complete') {
+ _domContentLoaded();
+ _doc.detachEvent('onreadystatechange', _domContentLoadedIE);
+ }
+ return true;
+ };
+ _winOnLoad = function() {
+ _windowLoaded = true;
+ _event.remove(_win, 'load', _winOnLoad);
+ };
+ _detectFlash();
+ _event.add(_win, 'focus', _handleFocus);
+ _event.add(_win, 'load', _handleFocus);
+ _event.add(_win, 'load', _delayWaitForEI);
+ _event.add(_win, 'load', _winOnLoad);
+ if (_isSafari && _tryInitOnFocus) {
+ _event.add(_win, 'mousemove', _handleFocus);
+ }
+ if (_doc.addEventListener) {
+ _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false);
+ } else if (_doc.attachEvent) {
+ _doc.attachEvent('onreadystatechange', _domContentLoadedIE);
+ } else {
+ _catchError({type:'NO_DOM2_EVENTS', fatal:true});
+ }
+ if (_doc.readyState === 'complete') {
+ setTimeout(_domContentLoaded,100);
+ }
+}
+// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading
+if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) {
+ soundManager = new SoundManager();
+}
+window.SoundManager = SoundManager;
+window.soundManager = soundManager;
+}(window)); \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/script/soundmanager2.js b/Processing-js/libs/inc/SoundManager2/script/soundmanager2.js
new file mode 100755
index 0000000..4b115c3
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/script/soundmanager2.js
@@ -0,0 +1,5019 @@
+/** @license
+ *
+ * SoundManager 2: JavaScript Sound for the Web
+ * ----------------------------------------------
+ * http://schillmania.com/projects/soundmanager2/
+ *
+ * Copyright (c) 2007, Scott Schiller. All rights reserved.
+ * Code provided under the BSD License:
+ * http://schillmania.com/projects/soundmanager2/license.txt
+ *
+ * V2.97a.20111220
+ */
+
+/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio */
+/* jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true */
+
+/**
+ * About this file
+ * ---------------
+ * This is the fully-commented source version of the SoundManager 2 API,
+ * recommended for use during development and testing.
+ *
+ * See soundmanager2-nodebug-jsmin.js for an optimized build (~10KB with gzip.)
+ * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion
+ * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)
+ *
+ * You may notice <d> and </d> comments in this source; these are delimiters for
+ * debug blocks which are removed in the -nodebug builds, further optimizing code size.
+ *
+ * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)
+ */
+
+(function(window) {
+
+var soundManager = null;
+
+/**
+ * The SoundManager constructor.
+ *
+ * @constructor
+ * @param {string} smURL Optional: Path to SWF files
+ * @param {string} smID Optional: The ID to use for the SWF container element
+ * @this {SoundManager}
+ * @return {SoundManager} The new SoundManager instance
+ */
+
+function SoundManager(smURL, smID) {
+ // Top-level configuration options
+
+ this.flashVersion = 8; // flash build to use (8 or 9.) Some API features require 9.
+ this.debugMode = true; // enable debugging output (console.log() with HTML fallback)
+ this.debugFlash = false; // enable debugging output inside SWF, troubleshoot Flash/browser issues
+ this.useConsole = true; // use console.log() if available (otherwise, writes to #soundmanager-debug element)
+ this.consoleOnly = true; // if console is being used, do not create/write to #soundmanager-debug
+ this.waitForWindowLoad = false; // force SM2 to wait for window.onload() before trying to call soundManager.onload()
+ this.bgColor = '#ffffff'; // SWF background color. N/A when wmode = 'transparent'
+ this.useHighPerformance = false; // position:fixed flash movie can help increase js/flash speed, minimize lag
+ this.flashPollingInterval = null; // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.
+ this.html5PollingInterval = null; // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.
+ this.flashLoadTimeout = 1000; // msec to wait for flash movie to load before failing (0 = infinity)
+ this.wmode = null; // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)
+ this.allowScriptAccess = 'always'; // for scripting the SWF (object/embed property), 'always' or 'sameDomain'
+ this.useFlashBlock = false; // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.
+ this.useHTML5Audio = true; // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible.
+ this.html5Test = /^(probably|maybe)$/i; // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.
+ this.preferFlash = true; // overrides useHTML5audio. if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers.
+ this.noSWFCache = false; // if true, appends ?ts={date} to break aggressive SWF caching.
+
+ this.audioFormats = {
+
+ /**
+ * determines HTML5 support + flash requirements.
+ * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start.
+ * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)
+ * multiple MIME types may be tested while trying to get a positive canPlayType() response.
+ */
+
+ 'mp3': {
+ 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
+ 'required': true
+ },
+
+ 'mp4': {
+ 'related': ['aac','m4a'], // additional formats under the MP4 container
+ 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
+ 'required': false
+ },
+
+ 'ogg': {
+ 'type': ['audio/ogg; codecs=vorbis'],
+ 'required': false
+ },
+
+ 'wav': {
+ 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
+ 'required': false
+ }
+
+ };
+
+ this.defaultOptions = {
+
+ /**
+ * the default configuration for sound objects made with createSound() and related methods
+ * eg., volume, auto-load behaviour and so forth
+ */
+
+ 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)
+ 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true)
+ 'from': null, // position to start playback within a sound (msec), default = beginning
+ 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)
+ 'onid3': null, // callback function for "ID3 data is added/available"
+ 'onload': null, // callback function for "load finished"
+ 'whileloading': null, // callback function for "download progress update" (X of Y bytes received)
+ 'onplay': null, // callback for "play" start
+ 'onpause': null, // callback for "pause"
+ 'onresume': null, // callback for "resume" (pause toggle)
+ 'whileplaying': null, // callback during play (position update)
+ 'onposition': null, // object containing times and function callbacks for positions of interest
+ 'onstop': null, // callback for "user stop"
+ 'onfailure': null, // callback function for when playing fails
+ 'onfinish': null, // callback function for "sound finished playing"
+ 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
+ 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled
+ 'position': null, // offset (milliseconds) to seek to within loaded sound data.
+ 'pan': 0, // "pan" settings, left-to-right, -100 to 100
+ 'stream': true, // allows playing before entire file has loaded (recommended)
+ 'to': null, // position to end playback within a sound (msec), default = end
+ 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3
+ 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)
+ 'volume': 100 // self-explanatory. 0-100, the latter being the max.
+
+ };
+
+ this.flash9Options = {
+
+ /**
+ * flash 9-only options,
+ * merged into defaultOptions if flash 9 is being used
+ */
+
+ 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
+ 'usePeakData': false, // enable left/right channel peak (level) data
+ 'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.
+ 'useEQData': false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.
+ 'onbufferchange': null, // callback for "isBuffering" property change
+ 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
+
+ };
+
+ this.movieStarOptions = {
+
+ /**
+ * flash 9.0r115+ MPEG4 audio options,
+ * merged into defaultOptions if flash 9+movieStar mode is enabled
+ */
+
+ 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)
+ 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants
+ 'onconnect': null, // rtmp: callback for connection to flash media server
+ 'duration': null // rtmp: song duration (msec)
+
+ };
+
+ // HTML attributes (id + class names) for the SWF container
+
+ this.movieID = 'sm2-container';
+ this.id = (smID || 'sm2movie');
+
+ this.debugID = 'soundmanager-debug';
+ this.debugURLParam = /([#?&])debug=1/i;
+
+ // dynamic attributes
+
+ this.versionNumber = 'V2.97a.20111220';
+ this.version = null;
+ this.movieURL = null;
+ this.url = (smURL || null);
+ this.altURL = null;
+ this.swfLoaded = false;
+ this.enabled = false;
+ this.oMC = null;
+ this.sounds = {};
+ this.soundIDs = [];
+ this.muted = false;
+ this.didFlashBlock = false;
+ this.filePattern = null;
+
+ this.filePatterns = {
+
+ 'flash8': /\.mp3(\?.*)?$/i,
+ 'flash9': /\.mp3(\?.*)?$/i
+
+ };
+
+ // support indicators, set at init
+
+ this.features = {
+
+ 'buffering': false,
+ 'peakData': false,
+ 'waveformData': false,
+ 'eqData': false,
+ 'movieStar': false
+
+ };
+
+ // flash sandbox info, used primarily in troubleshooting
+
+ this.sandbox = {
+
+ // <d>
+ 'type': null,
+ 'types': {
+ 'remote': 'remote (domain-based) rules',
+ 'localWithFile': 'local with file access (no internet access)',
+ 'localWithNetwork': 'local with network (internet access only, no local access)',
+ 'localTrusted': 'local, trusted (local+internet access)'
+ },
+ 'description': null,
+ 'noRemote': null,
+ 'noLocal': null
+ // </d>
+
+ };
+
+ /**
+ * basic HTML5 Audio() support test
+ * try...catch because of IE 9 "not implemented" nonsense
+ * https://github.com/Modernizr/Modernizr/issues/224
+ */
+
+ this.hasHTML5 = (function() {
+ try {
+ return (typeof Audio !== 'undefined' && typeof new Audio().canPlayType !== 'undefined');
+ } catch(e) {
+ return false;
+ }
+ }());
+
+ /**
+ * format support (html5/flash)
+ * stores canPlayType() results based on audioFormats.
+ * eg. { mp3: boolean, mp4: boolean }
+ * treat as read-only.
+ */
+
+ this.html5 = {
+ 'usingFlash': null // set if/when flash fallback is needed
+ };
+
+ this.flash = {}; // file type support hash
+
+ this.html5Only = false; // determined at init time
+ this.ignoreFlash = false; // used for special cases (eg. iPad/iPhone/palm OS?)
+
+ /**
+ * a few private internals (OK, a lot. :D)
+ */
+
+ var SMSound,
+ _s = this, _flash = null, _sm = 'soundManager', _smc = _sm+'::', _h5 = 'HTML5::', _id, _ua = navigator.userAgent, _win = window, _wl = _win.location.href.toString(), _doc = document, _doNothing, _init, _fV, _on_queue = [], _debugOpen = true, _debugTS, _didAppend = false, _appendSuccess = false, _didInit = false, _disabled = false, _windowLoaded = false, _wDS, _wdCount = 0, _initComplete, _mixin, _addOnEvent, _processOnEvents, _initUserOnload, _delayWaitForEI, _waitForEI, _setVersionInfo, _handleFocus, _strings, _initMovie, _domContentLoaded, _winOnLoad, _didDCLoaded, _getDocument, _createMovie, _catchError, _setPolling, _initDebug, _debugLevels = ['log', 'info', 'warn', 'error'], _defaultFlashVersion = 8, _disableObject, _failSafely, _normalizeMovieURL, _oRemoved = null, _oRemovedHTML = null, _str, _flashBlockHandler, _getSWFCSS, _swfCSS, _toggleDebug, _loopFix, _policyFix, _complain, _idCheck, _waitingForEI = false, _initPending = false, _smTimer, _onTimer, _startTimer, _stopTimer, _timerExecute, _h5TimerCount = 0, _h5IntervalTimer = null, _parseURL,
+ _needsFlash = null, _featureCheck, _html5OK, _html5CanPlay, _html5Ext, _html5Unload, _domContentLoadedIE, _testHTML5, _event, _slice = Array.prototype.slice, _useGlobalHTML5Audio = false, _hasFlash, _detectFlash, _badSafariFix, _html5_events, _showSupport,
+ _is_iDevice = _ua.match(/(ipad|iphone|ipod)/i), _is_firefox = _ua.match(/firefox/i), _is_android = _ua.match(/droid/i), _isIE = _ua.match(/msie/i), _isWebkit = _ua.match(/webkit/i), _isSafari = (_ua.match(/safari/i) && !_ua.match(/chrome/i)), _isOpera = (_ua.match(/opera/i)),
+ _likesHTML5 = (_ua.match(/(mobile|pre\/|xoom)/i) || _is_iDevice),
+ _isBadSafari = (!_wl.match(/usehtml5audio/i) && !_wl.match(/sm2\-ignorebadua/i) && _isSafari && !_ua.match(/silk/i) && _ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159
+ _hasConsole = (typeof console !== 'undefined' && typeof console.log !== 'undefined'), _isFocused = (typeof _doc.hasFocus !== 'undefined'?_doc.hasFocus():null), _tryInitOnFocus = (_isSafari && typeof _doc.hasFocus === 'undefined'), _okToDisable = !_tryInitOnFocus, _flashMIME = /(mp3|mp4|mpa)/i,
+ _emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)
+ _overHTTP = (_doc.location?_doc.location.protocol.match(/http/i):null),
+ _http = (!_overHTTP ? 'http:/'+'/' : ''),
+ // mp3, mp4, aac etc.
+ _netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|mp4v|3gp|3g2)\s*(?:$|;)/i,
+ // Flash v9.0r115+ "moviestar" formats
+ _netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'mp4v', '3gp', '3g2'],
+ _netStreamPattern = new RegExp('\\.(' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+
+ this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set
+
+ // use altURL if not "online"
+ this.useAltURL = !_overHTTP;
+ this._global_a = null;
+
+ _swfCSS = {
+
+ 'swfBox': 'sm2-object-box',
+ 'swfDefault': 'movieContainer',
+ 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error)
+ 'swfTimedout': 'swf_timedout',
+ 'swfLoaded': 'swf_loaded',
+ 'swfUnblocked': 'swf_unblocked', // or loaded OK
+ 'sm2Debug': 'sm2_debug',
+ 'highPerf': 'high_performance',
+ 'flashDebug': 'flash_debug'
+
+ };
+
+ if (_likesHTML5) {
+
+ // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.
+ _s.useHTML5Audio = true;
+ _s.preferFlash = false;
+
+ if (_is_iDevice) {
+ // by default, use global feature. iOS onfinish() -> next may fail otherwise.
+ _s.ignoreFlash = true;
+ _useGlobalHTML5Audio = true;
+ }
+
+ }
+
+ /**
+ * Public SoundManager API
+ * -----------------------
+ */
+
+ this.ok = function() {
+
+ return (_needsFlash?(_didInit && !_disabled):(_s.useHTML5Audio && _s.hasHTML5));
+
+ };
+
+ this.supported = this.ok; // legacy
+
+ this.getMovie = function(smID) {
+
+ // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version
+ return _id(smID) || _doc[smID] || _win[smID];
+
+ };
+
+ /**
+ * Creates a SMSound sound object instance.
+ *
+ * @param {object} oOptions Sound options (at minimum, id and url are required.)
+ * @return {object} SMSound The new SMSound object.
+ */
+
+ this.createSound = function(oOptions) {
+
+ var _cs, _cs_string,
+ thisOptions = null, oSound = null, _tO = null;
+
+ // <d>
+ _cs = _sm+'.createSound(): ';
+ _cs_string = _cs + _str(!_didInit?'notReady':'notOK');
+ // </d>
+
+ if (!_didInit || !_s.ok()) {
+ _complain(_cs_string);
+ return false;
+ }
+
+ if (arguments.length === 2) {
+ // function overloading in JS! :) ..assume simple createSound(id,url) use case
+ oOptions = {
+ 'id': arguments[0],
+ 'url': arguments[1]
+ };
+ }
+
+ // inherit from defaultOptions
+ thisOptions = _mixin(oOptions);
+
+ thisOptions.url = _parseURL(thisOptions.url);
+
+ // local shortcut
+ _tO = thisOptions;
+
+ // <d>
+ if (_tO.id.toString().charAt(0).match(/^[0-9]$/)) {
+ _s._wD(_cs + _str('badID', _tO.id), 2);
+ }
+
+ _s._wD(_cs + _tO.id + ' (' + _tO.url + ')', 1);
+ // </d>
+
+ if (_idCheck(_tO.id, true)) {
+ _s._wD(_cs + _tO.id + ' exists', 1);
+ return _s.sounds[_tO.id];
+ }
+
+ function make() {
+
+ thisOptions = _loopFix(thisOptions);
+ _s.sounds[_tO.id] = new SMSound(_tO);
+ _s.soundIDs.push(_tO.id);
+ return _s.sounds[_tO.id];
+
+ }
+
+ if (_html5OK(_tO)) {
+
+ oSound = make();
+ _s._wD('Loading sound '+_tO.id+' via HTML5');
+ oSound._setup_html5(_tO);
+
+ } else {
+
+ if (_fV > 8) {
+ if (_tO.isMovieStar === null) {
+ // attempt to detect MPEG-4 formats
+ _tO.isMovieStar = (_tO.serverURL || (_tO.type ? _tO.type.match(_netStreamMimeTypes) : false) || _tO.url.match(_netStreamPattern));
+ }
+ // <d>
+ if (_tO.isMovieStar) {
+ _s._wD(_cs + 'using MovieStar handling');
+ }
+ // </d>
+ if (_tO.isMovieStar) {
+ if (_tO.usePeakData) {
+ _wDS('noPeak');
+ _tO.usePeakData = false;
+ }
+ // <d>
+ if (_tO.loops > 1) {
+ _wDS('noNSLoop');
+ }
+ // </d>
+ }
+ }
+
+ _tO = _policyFix(_tO, _cs);
+ oSound = make();
+
+ if (_fV === 8) {
+ _flash._createSound(_tO.id, _tO.loops||1, _tO.usePolicyFile);
+ } else {
+ _flash._createSound(_tO.id, _tO.url, _tO.usePeakData, _tO.useWaveformData, _tO.useEQData, _tO.isMovieStar, (_tO.isMovieStar?_tO.bufferTime:false), _tO.loops||1, _tO.serverURL, _tO.duration||null, _tO.autoPlay, true, _tO.autoLoad, _tO.usePolicyFile);
+ if (!_tO.serverURL) {
+ // We are connected immediately
+ oSound.connected = true;
+ if (_tO.onconnect) {
+ _tO.onconnect.apply(oSound);
+ }
+ }
+ }
+
+ if (!_tO.serverURL && (_tO.autoLoad || _tO.autoPlay)) {
+ // call load for non-rtmp streams
+ oSound.load(_tO);
+ }
+
+ }
+
+ // rtmp will play in onconnect
+ if (!_tO.serverURL && _tO.autoPlay) {
+ oSound.play();
+ }
+
+ return oSound;
+
+ };
+
+ /**
+ * Destroys a SMSound sound object instance.
+ *
+ * @param {string} sID The ID of the sound to destroy
+ */
+
+ this.destroySound = function(sID, _bFromSound) {
+
+ // explicitly destroy a sound before normal page unload, etc.
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+
+ var oS = _s.sounds[sID], i;
+
+ // Disable all callbacks while the sound is being destroyed
+ oS._iO = {};
+
+ oS.stop();
+ oS.unload();
+
+ for (i = 0; i < _s.soundIDs.length; i++) {
+ if (_s.soundIDs[i] === sID) {
+ _s.soundIDs.splice(i, 1);
+ break;
+ }
+ }
+
+ if (!_bFromSound) {
+ // ignore if being called from SMSound instance
+ oS.destruct(true);
+ }
+
+ oS = null;
+ delete _s.sounds[sID];
+
+ return true;
+
+ };
+
+ /**
+ * Calls the load() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {object} oOptions Optional: Sound options
+ */
+
+ this.load = function(sID, oOptions) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].load(oOptions);
+
+ };
+
+ /**
+ * Calls the unload() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ */
+
+ this.unload = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].unload();
+
+ };
+
+ /**
+ * Calls the onPosition() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {number} nPosition The position to watch for
+ * @param {function} oMethod The relevant callback to fire
+ * @param {object} oScope Optional: The scope to apply the callback to
+ * @return {SMSound} The SMSound object
+ */
+
+ this.onPosition = function(sID, nPosition, oMethod, oScope) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].onposition(nPosition, oMethod, oScope);
+
+ };
+
+ // legacy/backwards-compability: lower-case method name
+ this.onposition = this.onPosition;
+
+ /**
+ * Calls the clearOnPosition() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {number} nPosition The position to watch for
+ * @param {function} oMethod Optional: The relevant callback to fire
+ * @return {SMSound} The SMSound object
+ */
+
+ this.clearOnPosition = function(sID, nPosition, oMethod) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].clearOnPosition(nPosition, oMethod);
+
+ };
+
+ /**
+ * Calls the play() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {object} oOptions Optional: Sound options
+ * @return {SMSound} The SMSound object
+ */
+
+ this.play = function(sID, oOptions) {
+
+ if (!_didInit || !_s.ok()) {
+ _complain(_sm+'.play(): ' + _str(!_didInit?'notReady':'notOK'));
+ return false;
+ }
+
+ if (!_idCheck(sID)) {
+ if (!(oOptions instanceof Object)) {
+ // overloading use case: play('mySound','/path/to/some.mp3');
+ oOptions = {
+ url: oOptions
+ };
+ }
+ if (oOptions && oOptions.url) {
+ // overloading use case, create+play: .play('someID',{url:'/path/to.mp3'});
+ _s._wD(_sm+'.play(): attempting to create "' + sID + '"', 1);
+ oOptions.id = sID;
+ return _s.createSound(oOptions).play();
+ } else {
+ return false;
+ }
+ }
+
+ return _s.sounds[sID].play(oOptions);
+
+ };
+
+ this.start = this.play; // just for convenience
+
+ /**
+ * Calls the setPosition() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {number} nMsecOffset Position (milliseconds)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setPosition = function(sID, nMsecOffset) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setPosition(nMsecOffset);
+
+ };
+
+ /**
+ * Calls the stop() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.stop = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+
+ _s._wD(_sm+'.stop(' + sID + ')', 1);
+ return _s.sounds[sID].stop();
+
+ };
+
+ /**
+ * Stops all currently-playing sounds.
+ */
+
+ this.stopAll = function() {
+
+ var oSound;
+ _s._wD(_sm+'.stopAll()', 1);
+
+ for (oSound in _s.sounds) {
+ if (_s.sounds.hasOwnProperty(oSound)) {
+ // apply only to sound objects
+ _s.sounds[oSound].stop();
+ }
+ }
+
+ };
+
+ /**
+ * Calls the pause() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.pause = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].pause();
+
+ };
+
+ /**
+ * Pauses all currently-playing sounds.
+ */
+
+ this.pauseAll = function() {
+
+ var i;
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].pause();
+ }
+
+ };
+
+ /**
+ * Calls the resume() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.resume = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].resume();
+
+ };
+
+ /**
+ * Resumes all currently-paused sounds.
+ */
+
+ this.resumeAll = function() {
+
+ var i;
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].resume();
+ }
+
+ };
+
+ /**
+ * Calls the togglePause() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.togglePause = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].togglePause();
+
+ };
+
+ /**
+ * Calls the setPan() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {number} nPan The pan value (-100 to 100)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setPan = function(sID, nPan) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setPan(nPan);
+
+ };
+
+ /**
+ * Calls the setVolume() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @param {number} nVol The volume value (0 to 100)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setVolume = function(sID, nVol) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].setVolume(nVol);
+
+ };
+
+ /**
+ * Calls the mute() method of either a single SMSound object by ID, or all sound objects.
+ *
+ * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
+ */
+
+ this.mute = function(sID) {
+
+ var i = 0;
+
+ if (typeof sID !== 'string') {
+ sID = null;
+ }
+
+ if (!sID) {
+ _s._wD(_sm+'.mute(): Muting all sounds');
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].mute();
+ }
+ _s.muted = true;
+ } else {
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ _s._wD(_sm+'.mute(): Muting "' + sID + '"');
+ return _s.sounds[sID].mute();
+ }
+
+ return true;
+
+ };
+
+ /**
+ * Mutes all sounds.
+ */
+
+ this.muteAll = function() {
+
+ _s.mute();
+
+ };
+
+ /**
+ * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.
+ *
+ * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
+ */
+
+ this.unmute = function(sID) {
+
+ var i;
+
+ if (typeof sID !== 'string') {
+ sID = null;
+ }
+
+ if (!sID) {
+
+ _s._wD(_sm+'.unmute(): Unmuting all sounds');
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].unmute();
+ }
+ _s.muted = false;
+
+ } else {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ _s._wD(_sm+'.unmute(): Unmuting "' + sID + '"');
+ return _s.sounds[sID].unmute();
+
+ }
+
+ return true;
+
+ };
+
+ /**
+ * Unmutes all sounds.
+ */
+
+ this.unmuteAll = function() {
+
+ _s.unmute();
+
+ };
+
+ /**
+ * Calls the toggleMute() method of a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.toggleMute = function(sID) {
+
+ if (!_idCheck(sID)) {
+ return false;
+ }
+ return _s.sounds[sID].toggleMute();
+
+ };
+
+ /**
+ * Retrieves the memory used by the flash plugin.
+ *
+ * @return {number} The amount of memory in use
+ */
+
+ this.getMemoryUse = function() {
+
+ // flash-only
+ var ram = 0;
+
+ if (_flash && _fV !== 8) {
+ ram = parseInt(_flash._getMemoryUse(), 10);
+ }
+
+ return ram;
+
+ };
+
+ /**
+ * Undocumented: NOPs soundManager and all SMSound objects.
+ */
+
+ this.disable = function(bNoDisable) {
+
+ // destroy all functions
+ var i;
+
+ if (typeof bNoDisable === 'undefined') {
+ bNoDisable = false;
+ }
+
+ if (_disabled) {
+ return false;
+ }
+
+ _disabled = true;
+ _wDS('shutdown', 1);
+
+ for (i = _s.soundIDs.length; i--;) {
+ _disableObject(_s.sounds[_s.soundIDs[i]]);
+ }
+
+ // fire "complete", despite fail
+ _initComplete(bNoDisable);
+ _event.remove(_win, 'load', _initUserOnload);
+
+ return true;
+
+ };
+
+ /**
+ * Determines playability of a MIME type, eg. 'audio/mp3'.
+ */
+
+ this.canPlayMIME = function(sMIME) {
+
+ var result;
+
+ if (_s.hasHTML5) {
+ result = _html5CanPlay({type:sMIME});
+ }
+
+ if (!_needsFlash || result) {
+ // no flash, or OK
+ return result;
+ } else {
+ // if flash 9, test netStream (movieStar) types as well.
+ return (sMIME ? !!((_fV > 8 ? sMIME.match(_netStreamMimeTypes) : null) || sMIME.match(_s.mimePattern)) : null);
+ }
+
+ };
+
+ /**
+ * Determines playability of a URL based on audio support.
+ *
+ * @param {string} sURL The URL to test
+ * @return {boolean} URL playability
+ */
+
+ this.canPlayURL = function(sURL) {
+
+ var result;
+
+ if (_s.hasHTML5) {
+ result = _html5CanPlay({url: sURL});
+ }
+
+ if (!_needsFlash || result) {
+ // no flash, or OK
+ return result;
+ } else {
+ return (sURL ? !!(sURL.match(_s.filePattern)) : null);
+ }
+
+ };
+
+ /**
+ * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.
+ *
+ * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes
+ * @return {boolean} URL playability
+ */
+
+ this.canPlayLink = function(oLink) {
+
+ if (typeof oLink.type !== 'undefined' && oLink.type) {
+ if (_s.canPlayMIME(oLink.type)) {
+ return true;
+ }
+ }
+
+ return _s.canPlayURL(oLink.href);
+
+ };
+
+ /**
+ * Retrieves a SMSound object by ID.
+ *
+ * @param {string} sID The ID of the sound
+ * @return {SMSound} The SMSound object
+ */
+
+ this.getSoundById = function(sID, _suppressDebug) {
+
+ if (!sID) {
+ throw new Error(_sm+'.getSoundById(): sID is null/undefined');
+ }
+
+ var result = _s.sounds[sID];
+
+ // <d>
+ if (!result && !_suppressDebug) {
+ _s._wD('"' + sID + '" is an invalid sound ID.', 2);
+ }
+ // </d>
+
+ return result;
+
+ };
+
+ /**
+ * Queues a callback for execution when SoundManager has successfully initialized.
+ *
+ * @param {function} oMethod The callback method to fire
+ * @param {object} oScope Optional: The scope to apply to the callback
+ */
+
+ this.onready = function(oMethod, oScope) {
+
+ var sType = 'onready';
+
+ if (oMethod && oMethod instanceof Function) {
+
+ // <d>
+ if (_didInit) {
+ _s._wD(_str('queue', sType));
+ }
+ // </d>
+
+ if (!oScope) {
+ oScope = _win;
+ }
+
+ _addOnEvent(sType, oMethod, oScope);
+ _processOnEvents();
+
+ return true;
+
+ } else {
+
+ throw _str('needFunction', sType);
+
+ }
+
+ };
+
+ /**
+ * Queues a callback for execution when SoundManager has failed to initialize.
+ *
+ * @param {function} oMethod The callback method to fire
+ * @param {object} oScope Optional: The scope to apply to the callback
+ */
+
+ this.ontimeout = function(oMethod, oScope) {
+
+ var sType = 'ontimeout';
+
+ if (oMethod && oMethod instanceof Function) {
+
+ // <d>
+ if (_didInit) {
+ _s._wD(_str('queue', sType));
+ }
+ // </d>
+
+ if (!oScope) {
+ oScope = _win;
+ }
+
+ _addOnEvent(sType, oMethod, oScope);
+ _processOnEvents({type:sType});
+
+ return true;
+
+ } else {
+
+ throw _str('needFunction', sType);
+
+ }
+
+ };
+
+ /**
+ * Writes console.log()-style debug output to a console or in-browser element.
+ * Applies when SoundManager.debugMode = true
+ *
+ * @param {string} sText The console message
+ * @param {string} sType Optional: Log type of 'info', 'warn' or 'error'
+ * @param {object} Optional: The scope to apply to the callback
+ */
+
+ this._writeDebug = function(sText, sType, _bTimestamp) {
+
+ // pseudo-private console.log()-style output
+ // <d>
+
+ var sDID = 'soundmanager-debug', o, oItem, sMethod;
+
+ if (!_s.debugMode) {
+ return false;
+ }
+
+ if (typeof _bTimestamp !== 'undefined' && _bTimestamp) {
+ sText = sText + ' | ' + new Date().getTime();
+ }
+
+ if (_hasConsole && _s.useConsole) {
+ sMethod = _debugLevels[sType];
+ if (typeof console[sMethod] !== 'undefined') {
+ console[sMethod](sText);
+ } else {
+ console.log(sText);
+ }
+ if (_s.consoleOnly) {
+ return true;
+ }
+ }
+
+ try {
+
+ o = _id(sDID);
+
+ if (!o) {
+ return false;
+ }
+
+ oItem = _doc.createElement('div');
+
+ if (++_wdCount % 2 === 0) {
+ oItem.className = 'sm2-alt';
+ }
+
+ if (typeof sType === 'undefined') {
+ sType = 0;
+ } else {
+ sType = parseInt(sType, 10);
+ }
+
+ oItem.appendChild(_doc.createTextNode(sText));
+
+ if (sType) {
+ if (sType >= 2) {
+ oItem.style.fontWeight = 'bold';
+ }
+ if (sType === 3) {
+ oItem.style.color = '#ff3333';
+ }
+ }
+
+ // top-to-bottom
+ // o.appendChild(oItem);
+
+ // bottom-to-top
+ o.insertBefore(oItem, o.firstChild);
+
+ } catch(e) {
+ // oh well
+ }
+
+ o = null;
+ // </d>
+
+ return true;
+
+ };
+
+ // alias
+ this._wD = this._writeDebug;
+
+ /**
+ * Provides debug / state information on all SMSound objects.
+ */
+
+ this._debug = function() {
+
+ // <d>
+ var i, j;
+ _wDS('currentObj', 1);
+
+ for (i = 0, j = _s.soundIDs.length; i < j; i++) {
+ _s.sounds[_s.soundIDs[i]]._debug();
+ }
+ // </d>
+
+ };
+
+ /**
+ * Restarts and re-initializes the SoundManager instance.
+ */
+
+ this.reboot = function() {
+
+ // attempt to reset and init SM2
+ _s._wD(_sm+'.reboot()');
+
+ // <d>
+ if (_s.soundIDs.length) {
+ _s._wD('Destroying ' + _s.soundIDs.length + ' SMSound objects...');
+ }
+ // </d>
+
+ var i, j;
+
+ for (i = _s.soundIDs.length; i--;) {
+ _s.sounds[_s.soundIDs[i]].destruct();
+ }
+
+ // trash ze flash
+
+ try {
+ if (_isIE) {
+ _oRemovedHTML = _flash.innerHTML;
+ }
+ _oRemoved = _flash.parentNode.removeChild(_flash);
+ _s._wD('Flash movie removed.');
+ } catch(e) {
+ // uh-oh.
+ _wDS('badRemove', 2);
+ }
+
+ // actually, force recreate of movie.
+ _oRemovedHTML = _oRemoved = _needsFlash = null;
+
+ _s.enabled = _didDCLoaded = _didInit = _waitingForEI = _initPending = _didAppend = _appendSuccess = _disabled = _s.swfLoaded = false;
+ _s.soundIDs = _s.sounds = [];
+ _flash = null;
+
+ for (i in _on_queue) {
+ if (_on_queue.hasOwnProperty(i)) {
+ for (j = _on_queue[i].length; j--;) {
+ _on_queue[i][j].fired = false;
+ }
+ }
+ }
+
+ _s._wD(_sm + ': Rebooting...');
+ _win.setTimeout(_s.beginDelayedInit, 20);
+
+ };
+
+ /**
+ * Undocumented: Determines the SM2 flash movie's load progress.
+ *
+ * @return {number or null} Percent loaded, or if invalid/unsupported, null.
+ */
+
+ this.getMoviePercent = function() {
+
+ return (_flash && typeof _flash.PercentLoaded !== 'undefined' ? _flash.PercentLoaded() : null);
+
+ };
+
+ /**
+ * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().
+ */
+
+ this.beginDelayedInit = function() {
+
+ _windowLoaded = true;
+ _domContentLoaded();
+
+ setTimeout(function() {
+
+ if (_initPending) {
+ return false;
+ }
+
+ _createMovie();
+ _initMovie();
+ _initPending = true;
+
+ return true;
+
+ }, 20);
+
+ _delayWaitForEI();
+
+ };
+
+ /**
+ * Destroys the SoundManager instance and all SMSound instances.
+ */
+
+ this.destruct = function() {
+
+ _s._wD(_sm+'.destruct()');
+ _s.disable(true);
+
+ };
+
+ /**
+ * SMSound() (sound object) constructor
+ * ------------------------------------
+ *
+ * @param {object} oOptions Sound options (id and url are required attributes)
+ * @return {SMSound} The new SMSound object
+ */
+
+ SMSound = function(oOptions) {
+
+ var _t = this, _resetProperties, _add_html5_events, _remove_html5_events, _stop_html5_timer, _start_html5_timer, _attachOnPosition, _onplay_called = false, _onPositionItems = [], _onPositionFired = 0, _detachOnPosition, _applyFromTo, _lastURL = null;
+
+ var _lastHTML5State = {
+ // tracks duration + position (time)
+ duration: null,
+ time: null
+ };
+
+ this.sID = oOptions.id;
+ this.url = oOptions.url;
+ this.options = _mixin(oOptions);
+
+ // per-play-instance-specific options
+ this.instanceOptions = this.options;
+
+ // short alias
+ this._iO = this.instanceOptions;
+
+ // assign property defaults
+ this.pan = this.options.pan;
+ this.volume = this.options.volume;
+ this.isHTML5 = false;
+ this._a = null;
+
+ /**
+ * SMSound() public methods
+ * ------------------------
+ */
+
+ this.id3 = {};
+
+ /**
+ * Writes SMSound object parameters to debug console
+ */
+
+ this._debug = function() {
+
+ // <d>
+ // pseudo-private console.log()-style output
+
+ if (_s.debugMode) {
+
+ var stuff = null, msg = [], sF, sfBracket, maxLength = 64;
+
+ for (stuff in _t.options) {
+ if (_t.options[stuff] !== null) {
+ if (_t.options[stuff] instanceof Function) {
+ // handle functions specially
+ sF = _t.options[stuff].toString();
+ // normalize spaces
+ sF = sF.replace(/\s\s+/g, ' ');
+ sfBracket = sF.indexOf('{');
+ msg.push(' ' + stuff + ': {' + sF.substr(sfBracket + 1, (Math.min(Math.max(sF.indexOf('\n') - 1, maxLength), maxLength))).replace(/\n/g, '') + '... }');
+ } else {
+ msg.push(' ' + stuff + ': ' + _t.options[stuff]);
+ }
+ }
+ }
+
+ _s._wD('SMSound() merged options: {\n' + msg.join(', \n') + '\n}');
+
+ }
+ // </d>
+
+ };
+
+ // <d>
+ this._debug();
+ // </d>
+
+ /**
+ * Begins loading a sound per its *url*.
+ *
+ * @param {object} oOptions Optional: Sound options
+ * @return {SMSound} The SMSound object
+ */
+
+ this.load = function(oOptions) {
+
+ var oS = null, _iO;
+
+ if (typeof oOptions !== 'undefined') {
+ _t._iO = _mixin(oOptions, _t.options);
+ _t.instanceOptions = _t._iO;
+ } else {
+ oOptions = _t.options;
+ _t._iO = oOptions;
+ _t.instanceOptions = _t._iO;
+ if (_lastURL && _lastURL !== _t.url) {
+ _wDS('manURL');
+ _t._iO.url = _t.url;
+ _t.url = null;
+ }
+ }
+
+ if (!_t._iO.url) {
+ _t._iO.url = _t.url;
+ }
+
+ _t._iO.url = _parseURL(_t._iO.url);
+
+ _s._wD('SMSound.load(): ' + _t._iO.url, 1);
+
+ if (_t._iO.url === _t.url && _t.readyState !== 0 && _t.readyState !== 2) {
+ _wDS('onURL', 1);
+ // if loaded and an onload() exists, fire immediately.
+ if (_t.readyState === 3 && _t._iO.onload) {
+ // assume success based on truthy duration.
+ _t._iO.onload.apply(_t, [(!!_t.duration)]);
+ }
+ return _t;
+ }
+
+ // local shortcut
+ _iO = _t._iO;
+
+ _lastURL = _t.url;
+ _t.loaded = false;
+ _t.readyState = 1;
+ _t.playState = 0;
+
+ // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.
+
+ if (_html5OK(_iO)) {
+
+ oS = _t._setup_html5(_iO);
+
+ if (!oS._called_load) {
+
+ _s._wD(_h5+'load: '+_t.sID);
+ _t._html5_canplay = false;
+
+ // given explicit load call, try to get whole file.
+ // early HTML5 implementation (non-standard)
+ _t._a.autobuffer = 'auto';
+ // standard
+ _t._a.preload = 'auto';
+
+ oS.load();
+ oS._called_load = true;
+
+ if (_iO.autoPlay) {
+ _t.play();
+ }
+
+ } else {
+ _s._wD(_h5+'ignoring request to load again: '+_t.sID);
+ }
+
+ } else {
+
+ try {
+ _t.isHTML5 = false;
+ _t._iO = _policyFix(_loopFix(_iO));
+ // re-assign local shortcut
+ _iO = _t._iO;
+ if (_fV === 8) {
+ _flash._load(_t.sID, _iO.url, _iO.stream, _iO.autoPlay, (_iO.whileloading?1:0), _iO.loops||1, _iO.usePolicyFile);
+ } else {
+ _flash._load(_t.sID, _iO.url, !!(_iO.stream), !!(_iO.autoPlay), _iO.loops||1, !!(_iO.autoLoad), _iO.usePolicyFile);
+ }
+ } catch(e) {
+ _wDS('smError', 2);
+ _debugTS('onload', false);
+ _catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
+
+ }
+
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Unloads a sound, canceling any open HTTP requests.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.unload = function() {
+
+ // Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL
+ // Flash 9/AS3: Close stream, preventing further load
+ // HTML5: Most UAs will use empty URL
+
+ if (_t.readyState !== 0) {
+
+ _s._wD('SMSound.unload(): "' + _t.sID + '"');
+
+ if (!_t.isHTML5) {
+ if (_fV === 8) {
+ _flash._unload(_t.sID, _emptyURL);
+ } else {
+ _flash._unload(_t.sID);
+ }
+ } else {
+ _stop_html5_timer();
+ if (_t._a) {
+ _t._a.pause();
+ _html5Unload(_t._a);
+ }
+ }
+
+ // reset load/status flags
+ _resetProperties();
+
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Unloads and destroys a sound.
+ */
+
+ this.destruct = function(_bFromSM) {
+
+ _s._wD('SMSound.destruct(): "' + _t.sID + '"');
+
+ if (!_t.isHTML5) {
+
+ // kill sound within Flash
+ // Disable the onfailure handler
+ _t._iO.onfailure = null;
+ _flash._destroySound(_t.sID);
+
+ } else {
+
+ _stop_html5_timer();
+
+ if (_t._a) {
+ _t._a.pause();
+ _html5Unload(_t._a);
+ if (!_useGlobalHTML5Audio) {
+ _remove_html5_events();
+ }
+ // break obvious circular reference
+ _t._a._t = null;
+ _t._a = null;
+ }
+
+ }
+
+ if (!_bFromSM) {
+ // ensure deletion from controller
+ _s.destroySound(_t.sID, true);
+
+ }
+
+ };
+
+ /**
+ * Begins playing a sound.
+ *
+ * @param {object} oOptions Optional: Sound options
+ * @return {SMSound} The SMSound object
+ */
+
+ this.play = function(oOptions, _updatePlayState) {
+
+ var fN, allowMulti, a, onready;
+
+ // <d>
+ fN = 'SMSound.play(): ';
+ // </d>
+
+ _updatePlayState = _updatePlayState === undefined ? true : _updatePlayState; // default to true
+
+ if (!oOptions) {
+ oOptions = {};
+ }
+
+ _t._iO = _mixin(oOptions, _t._iO);
+ _t._iO = _mixin(_t._iO, _t.options);
+ _t._iO.url = _parseURL(_t._iO.url);
+ _t.instanceOptions = _t._iO;
+
+ // RTMP-only
+ if (_t._iO.serverURL && !_t.connected) {
+ if (!_t.getAutoPlay()) {
+ _s._wD(fN+' Netstream not connected yet - setting autoPlay');
+ _t.setAutoPlay(true);
+ }
+ // play will be called in _onconnect()
+ return _t;
+ }
+
+ if (_html5OK(_t._iO)) {
+ _t._setup_html5(_t._iO);
+ _start_html5_timer();
+ }
+
+ if (_t.playState === 1 && !_t.paused) {
+ allowMulti = _t._iO.multiShot;
+ if (!allowMulti) {
+ _s._wD(fN + '"' + _t.sID + '" already playing (one-shot)', 1);
+ return _t;
+ } else {
+ _s._wD(fN + '"' + _t.sID + '" already playing (multi-shot)', 1);
+ }
+ }
+
+ if (!_t.loaded) {
+
+ if (_t.readyState === 0) {
+
+ _s._wD(fN + 'Attempting to load "' + _t.sID + '"', 1);
+
+ // try to get this sound playing ASAP
+ if (!_t.isHTML5) {
+ // assign directly because setAutoPlay() increments the instanceCount
+ _t._iO.autoPlay = true;
+ }
+
+ _t.load(_t._iO);
+
+ } else if (_t.readyState === 2) {
+
+ _s._wD(fN + 'Could not load "' + _t.sID + '" - exiting', 2);
+ return _t;
+
+ } else {
+
+ _s._wD(fN + '"' + _t.sID + '" is loading - attempting to play..', 1);
+
+ }
+
+ } else {
+
+ _s._wD(fN + '"' + _t.sID + '"');
+
+ }
+
+ if (!_t.isHTML5 && _fV === 9 && _t.position > 0 && _t.position === _t.duration) {
+ // flash 9 needs a position reset if play() is called while at the end of a sound.
+ _s._wD(fN + '"' + _t.sID + '": Sound at end, resetting to position:0');
+ oOptions.position = 0;
+ }
+
+ /**
+ * Streams will pause when their buffer is full if they are being loaded.
+ * In this case paused is true, but the song hasn't started playing yet.
+ * If we just call resume() the onplay() callback will never be called.
+ * So only call resume() if the position is > 0.
+ * Another reason is because options like volume won't have been applied yet.
+ */
+
+ if (_t.paused && _t.position && _t.position > 0) {
+
+ // https://gist.github.com/37b17df75cc4d7a90bf6
+ _s._wD(fN + '"' + _t.sID + '" is resuming from paused state',1);
+ _t.resume();
+
+ } else {
+
+ _t._iO = _mixin(oOptions, _t._iO);
+
+ // apply from/to parameters, if they exist (and not using RTMP)
+ if (_t._iO.from !== null && _t._iO.to !== null && _t.instanceCount === 0 && _t.playState === 0 && !_t._iO.serverURL) {
+
+ onready = function() {
+ // sound "canplay" or onload()
+ // re-apply from/to to instance options, and start playback
+ _t._iO = _mixin(oOptions, _t._iO);
+ _t.play(_t._iO);
+ };
+
+ // HTML5 needs to at least have "canplay" fired before seeking.
+ if (_t.isHTML5 && !_t._html5_canplay) {
+
+ // this hasn't been loaded yet. load it first, and then do this again.
+ _s._wD(fN+'Beginning load of "'+ _t.sID+'" for from/to case');
+
+ _t.load({
+ _oncanplay: onready
+ });
+
+ return false;
+
+ } else if (!_t.isHTML5 && !_t.loaded && (!_t.readyState || _t.readyState !== 2)) {
+
+ // to be safe, preload the whole thing in Flash.
+
+ _s._wD(fN+'Preloading "'+ _t.sID+'" for from/to case');
+
+ _t.load({
+ onload: onready
+ });
+
+ return false;
+
+ }
+
+ // otherwise, we're ready to go. re-apply local options, and continue
+
+ _t._iO = _applyFromTo();
+
+ }
+
+ _s._wD(fN+'"'+ _t.sID+'" is starting to play');
+
+ if (!_t.instanceCount || _t._iO.multiShotEvents || (!_t.isHTML5 && _fV > 8 && !_t.getAutoPlay())) {
+ _t.instanceCount++;
+ }
+
+ // if first play and onposition parameters exist, apply them now
+ if (_t.playState === 0 && _t._iO.onposition) {
+ _attachOnPosition(_t);
+ }
+
+ _t.playState = 1;
+ _t.paused = false;
+
+ _t.position = (typeof _t._iO.position !== 'undefined' && !isNaN(_t._iO.position) ? _t._iO.position : 0);
+
+ if (!_t.isHTML5) {
+ _t._iO = _policyFix(_loopFix(_t._iO));
+ }
+
+ if (_t._iO.onplay && _updatePlayState) {
+ _t._iO.onplay.apply(_t);
+ _onplay_called = true;
+ }
+
+ _t.setVolume(_t._iO.volume, true);
+ _t.setPan(_t._iO.pan, true);
+
+ if (!_t.isHTML5) {
+
+ _flash._start(_t.sID, _t._iO.loops || 1, (_fV === 9?_t._iO.position:_t._iO.position / 1000));
+
+ } else {
+
+ _start_html5_timer();
+ a = _t._setup_html5();
+ _t.setPosition(_t._iO.position);
+ a.play();
+
+ }
+
+ }
+
+ return _t;
+
+ };
+
+ // just for convenience
+ this.start = this.play;
+
+ /**
+ * Stops playing a sound (and optionally, all sounds)
+ *
+ * @param {boolean} bAll Optional: Whether to stop all sounds
+ * @return {SMSound} The SMSound object
+ */
+
+ this.stop = function(bAll) {
+
+ var _iO = _t._iO, _oP;
+
+ if (_t.playState === 1) {
+
+ _t._onbufferchange(0);
+ _t._resetOnPosition(0);
+ _t.paused = false;
+
+ if (!_t.isHTML5) {
+ _t.playState = 0;
+ }
+
+ // remove onPosition listeners, if any
+ _detachOnPosition();
+
+ // and "to" position, if set
+ if (_iO.to) {
+ _t.clearOnPosition(_iO.to);
+ }
+
+ if (!_t.isHTML5) {
+
+ _flash._stop(_t.sID, bAll);
+
+ // hack for netStream: just unload
+ if (_iO.serverURL) {
+ _t.unload();
+ }
+
+ } else {
+
+ if (_t._a) {
+
+ _oP = _t.position;
+
+ // act like Flash, though
+ _t.setPosition(0);
+
+ // hack: reflect old position for onstop() (also like Flash)
+ _t.position = _oP;
+
+ // html5 has no stop()
+ // NOTE: pausing means iOS requires interaction to resume.
+ _t._a.pause();
+
+ _t.playState = 0;
+
+ // and update UI
+ _t._onTimer();
+
+ _stop_html5_timer();
+
+ }
+
+ }
+
+ _t.instanceCount = 0;
+ _t._iO = {};
+
+ if (_iO.onstop) {
+ _iO.onstop.apply(_t);
+ }
+
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Undocumented/internal: Sets autoPlay for RTMP.
+ *
+ * @param {boolean} autoPlay state
+ */
+
+ this.setAutoPlay = function(autoPlay) {
+
+ _s._wD('sound '+_t.sID+' turned autoplay ' + (autoPlay ? 'on' : 'off'));
+ _t._iO.autoPlay = autoPlay;
+
+ if (!_t.isHTML5) {
+ _flash._setAutoPlay(_t.sID, autoPlay);
+ if (autoPlay) {
+ // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)
+ if (!_t.instanceCount && _t.readyState === 1) {
+ _t.instanceCount++;
+ _s._wD('sound '+_t.sID+' incremented instance count to '+_t.instanceCount);
+ }
+ }
+ }
+
+ };
+
+ /**
+ * Undocumented/internal: Returns the autoPlay boolean.
+ *
+ * @return {boolean} The current autoPlay value
+ */
+
+ this.getAutoPlay = function() {
+
+ return _t._iO.autoPlay;
+
+ };
+
+ /**
+ * Sets the position of a sound.
+ *
+ * @param {number} nMsecOffset Position (milliseconds)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setPosition = function(nMsecOffset) {
+
+ if (nMsecOffset === undefined) {
+ nMsecOffset = 0;
+ }
+
+ var original_pos,
+ position, position1K,
+ // Use the duration from the instance options, if we don't have a track duration yet.
+ // position >= 0 and <= current available (loaded) duration
+ offset = (_t.isHTML5 ? Math.max(nMsecOffset,0) : Math.min(_t.duration || _t._iO.duration, Math.max(nMsecOffset, 0)));
+
+ original_pos = _t.position;
+ _t.position = offset;
+ position1K = _t.position/1000;
+ _t._resetOnPosition(_t.position);
+ _t._iO.position = offset;
+
+ if (!_t.isHTML5) {
+
+ position = (_fV === 9 ? _t.position : position1K);
+ if (_t.readyState && _t.readyState !== 2) {
+ // if paused or not playing, will not resume (by playing)
+ _flash._setPosition(_t.sID, position, (_t.paused || !_t.playState));
+ }
+
+ } else if (_t._a) {
+
+ // Set the position in the canplay handler if the sound is not ready yet
+ if (_t._html5_canplay) {
+ if (_t._a.currentTime !== position1K) {
+ /**
+ * DOM/JS errors/exceptions to watch out for:
+ * if seek is beyond (loaded?) position, "DOM exception 11"
+ * "INDEX_SIZE_ERR": DOM exception 1
+ */
+ _s._wD('setPosition('+position1K+'): setting position');
+ try {
+ _t._a.currentTime = position1K;
+ if (_t.playState === 0 || _t.paused) {
+ // allow seek without auto-play/resume
+ _t._a.pause();
+ }
+ } catch(e) {
+ _s._wD('setPosition('+position1K+'): setting position failed: '+e.message, 2);
+ }
+ }
+ } else {
+ _s._wD('setPosition('+position1K+'): delaying, sound not ready');
+ }
+
+ }
+
+ if (_t.isHTML5) {
+ if (_t.paused) {
+ // if paused, refresh UI right away
+ // force update
+ _t._onTimer(true);
+ }
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Pauses sound playback.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.pause = function(_bCallFlash) {
+
+ if (_t.paused || (_t.playState === 0 && _t.readyState !== 1)) {
+ return _t;
+ }
+
+ _s._wD('SMSound.pause()');
+ _t.paused = true;
+
+ if (!_t.isHTML5) {
+ if (_bCallFlash || _bCallFlash === undefined) {
+ _flash._pause(_t.sID);
+ }
+ } else {
+ _t._setup_html5().pause();
+ _stop_html5_timer();
+ }
+
+ if (_t._iO.onpause) {
+ _t._iO.onpause.apply(_t);
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Resumes sound playback.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ /**
+ * When auto-loaded streams pause on buffer full they have a playState of 0.
+ * We need to make sure that the playState is set to 1 when these streams "resume".
+ * When a paused stream is resumed, we need to trigger the onplay() callback if it
+ * hasn't been called already. In this case since the sound is being played for the
+ * first time, I think it's more appropriate to call onplay() rather than onresume().
+ */
+
+ this.resume = function() {
+
+ var _iO = _t._iO;
+
+ if (!_t.paused) {
+ return _t;
+ }
+
+ _s._wD('SMSound.resume()');
+ _t.paused = false;
+ _t.playState = 1;
+
+ if (!_t.isHTML5) {
+ if (_iO.isMovieStar && !_iO.serverURL) {
+ // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.
+ _t.setPosition(_t.position);
+ }
+ // flash method is toggle-based (pause/resume)
+ _flash._pause(_t.sID);
+ } else {
+ _t._setup_html5().play();
+ _start_html5_timer();
+ }
+
+ if (_onplay_called && _iO.onplay) {
+ _iO.onplay.apply(_t);
+ _onplay_called = true;
+ } else if (_iO.onresume) {
+ _iO.onresume.apply(_t);
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Toggles sound playback.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.togglePause = function() {
+
+ _s._wD('SMSound.togglePause()');
+
+ if (_t.playState === 0) {
+ _t.play({
+ position: (_fV === 9 && !_t.isHTML5 ? _t.position : _t.position / 1000)
+ });
+ return _t;
+ }
+
+ if (_t.paused) {
+ _t.resume();
+ } else {
+ _t.pause();
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Sets the panning (L-R) effect.
+ *
+ * @param {number} nPan The pan value (-100 to 100)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setPan = function(nPan, bInstanceOnly) {
+
+ if (typeof nPan === 'undefined') {
+ nPan = 0;
+ }
+
+ if (typeof bInstanceOnly === 'undefined') {
+ bInstanceOnly = false;
+ }
+
+ if (!_t.isHTML5) {
+ _flash._setPan(_t.sID, nPan);
+ } // else { no HTML5 pan? }
+
+ _t._iO.pan = nPan;
+
+ if (!bInstanceOnly) {
+ _t.pan = nPan;
+ _t.options.pan = nPan;
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Sets the volume.
+ *
+ * @param {number} nVol The volume value (0 to 100)
+ * @return {SMSound} The SMSound object
+ */
+
+ this.setVolume = function(nVol, _bInstanceOnly) {
+
+ /**
+ * Note: Setting volume has no effect on iOS "special snowflake" devices.
+ * Hardware volume control overrides software, and volume
+ * will always return 1 per Apple docs. (iOS 4 + 5.)
+ * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html
+ */
+
+ if (typeof nVol === 'undefined') {
+ nVol = 100;
+ }
+
+ if (typeof _bInstanceOnly === 'undefined') {
+ _bInstanceOnly = false;
+ }
+
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, (_s.muted && !_t.muted) || _t.muted?0:nVol);
+ } else if (_t._a) {
+ // valid range: 0-1
+ _t._a.volume = Math.max(0, Math.min(1, nVol/100));
+ }
+
+ _t._iO.volume = nVol;
+
+ if (!_bInstanceOnly) {
+ _t.volume = nVol;
+ _t.options.volume = nVol;
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Mutes the sound.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.mute = function() {
+
+ _t.muted = true;
+
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, 0);
+ } else if (_t._a) {
+ _t._a.muted = true;
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Unmutes the sound.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.unmute = function() {
+
+ _t.muted = false;
+ var hasIO = typeof _t._iO.volume !== 'undefined';
+
+ if (!_t.isHTML5) {
+ _flash._setVolume(_t.sID, hasIO?_t._iO.volume:_t.options.volume);
+ } else if (_t._a) {
+ _t._a.muted = false;
+ }
+
+ return _t;
+
+ };
+
+ /**
+ * Toggles the muted state of a sound.
+ *
+ * @return {SMSound} The SMSound object
+ */
+
+ this.toggleMute = function() {
+
+ return (_t.muted?_t.unmute():_t.mute());
+
+ };
+
+ /**
+ * Registers a callback to be fired when a sound reaches a given position during playback.
+ *
+ * @param {number} nPosition The position to watch for
+ * @param {function} oMethod The relevant callback to fire
+ * @param {object} oScope Optional: The scope to apply the callback to
+ * @return {SMSound} The SMSound object
+ */
+
+ this.onPosition = function(nPosition, oMethod, oScope) {
+
+ // TODO: basic dupe checking?
+
+ _onPositionItems.push({
+ position: nPosition,
+ method: oMethod,
+ scope: (typeof oScope !== 'undefined' ? oScope : _t),
+ fired: false
+ });
+
+ return _t;
+
+ };
+
+ // legacy/backwards-compability: lower-case method name
+ this.onposition = this.onPosition;
+
+ /**
+ * Removes registered callback(s) from a sound, by position and/or callback.
+ *
+ * @param {number} nPosition The position to clear callback(s) for
+ * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position
+ * @return {SMSound} The SMSound object
+ */
+
+ this.clearOnPosition = function(nPosition, oMethod) {
+
+ var i;
+
+ nPosition = parseInt(nPosition, 10);
+
+ if (isNaN(nPosition)) {
+ // safety check
+ return false;
+ }
+
+ for (i=0; i < _onPositionItems.length; i++) {
+
+ if (nPosition === _onPositionItems[i].position) {
+ // remove this item if no method was specified, or, if the method matches
+ if (!oMethod || (oMethod === _onPositionItems[i].method)) {
+ if (_onPositionItems[i].fired) {
+ // decrement "fired" counter, too
+ _onPositionFired--;
+ }
+ _onPositionItems.splice(i, 1);
+ }
+ }
+
+ }
+
+ };
+
+ this._processOnPosition = function() {
+
+ var i, item, j = _onPositionItems.length;
+
+ if (!j || !_t.playState || _onPositionFired >= j) {
+ return false;
+ }
+
+ for (i=j; i--;) {
+ item = _onPositionItems[i];
+ if (!item.fired && _t.position >= item.position) {
+ item.fired = true;
+ _onPositionFired++;
+ item.method.apply(item.scope, [item.position]);
+ }
+ }
+
+ return true;
+
+ };
+
+ this._resetOnPosition = function(nPosition) {
+
+ // reset "fired" for items interested in this position
+ var i, item, j = _onPositionItems.length;
+
+ if (!j) {
+ return false;
+ }
+
+ for (i=j; i--;) {
+ item = _onPositionItems[i];
+ if (item.fired && nPosition <= item.position) {
+ item.fired = false;
+ _onPositionFired--;
+ }
+ }
+
+ return true;
+
+ };
+
+ /**
+ * SMSound() private internals
+ * --------------------------------
+ */
+
+ _applyFromTo = function() {
+
+ var _iO = _t._iO,
+ f = _iO.from,
+ t = _iO.to,
+ start, end;
+
+ end = function() {
+
+ // end has been reached.
+ _s._wD(_t.sID + ': "to" time of ' + t + ' reached.');
+
+ // detach listener
+ _t.clearOnPosition(t, end);
+
+ // stop should clear this, too
+ _t.stop();
+
+ };
+
+ start = function() {
+
+ _s._wD(_t.sID + ': playing "from" ' + f);
+
+ // add listener for end
+ if (t !== null && !isNaN(t)) {
+ _t.onPosition(t, end);
+ }
+
+ };
+
+ if (f !== null && !isNaN(f)) {
+
+ // apply to instance options, guaranteeing correct start position.
+ _iO.position = f;
+
+ // multiShot timing can't be tracked, so prevent that.
+ _iO.multiShot = false;
+
+ start();
+
+ }
+
+ // return updated instanceOptions including starting position
+ return _iO;
+
+ };
+
+ _attachOnPosition = function() {
+
+ var op = _t._iO.onposition;
+
+ // attach onposition things, if any, now.
+
+ if (op) {
+
+ var item;
+
+ for (item in op) {
+ if (op.hasOwnProperty(item)) {
+ _t.onPosition(parseInt(item, 10), op[item]);
+ }
+ }
+
+ }
+
+ };
+
+ _detachOnPosition = function() {
+
+ var op = _t._iO.onposition;
+
+ // detach any onposition()-style listeners.
+
+ if (op) {
+
+ var item;
+
+ for (item in op) {
+ if (op.hasOwnProperty(item)) {
+ _t.clearOnPosition(parseInt(item, 10));
+ }
+ }
+
+ }
+
+ };
+
+ _start_html5_timer = function() {
+
+ if (_t.isHTML5) {
+ _startTimer(_t);
+ }
+
+ };
+
+ _stop_html5_timer = function() {
+
+ if (_t.isHTML5) {
+ _stopTimer(_t);
+ }
+
+ };
+
+ _resetProperties = function() {
+
+ _onPositionItems = [];
+ _onPositionFired = 0;
+ _onplay_called = false;
+
+ _t._hasTimer = null;
+ _t._a = null;
+ _t._html5_canplay = false;
+ _t.bytesLoaded = null;
+ _t.bytesTotal = null;
+ _t.duration = (_t._iO && _t._iO.duration ? _t._iO.duration : null);
+ _t.durationEstimate = null;
+
+ // legacy: 1D array
+ _t.eqData = [];
+
+ _t.eqData.left = [];
+ _t.eqData.right = [];
+
+ _t.failures = 0;
+ _t.isBuffering = false;
+ _t.instanceOptions = {};
+ _t.instanceCount = 0;
+ _t.loaded = false;
+ _t.metadata = {};
+
+ // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success
+ _t.readyState = 0;
+
+ _t.muted = false;
+ _t.paused = false;
+
+ _t.peakData = {
+ left: 0,
+ right: 0
+ };
+
+ _t.waveformData = {
+ left: [],
+ right: []
+ };
+
+ _t.playState = 0;
+ _t.position = null;
+
+ };
+
+ _resetProperties();
+
+ /**
+ * Pseudo-private SMSound internals
+ * --------------------------------
+ */
+
+ this._onTimer = function(bForce) {
+
+ /**
+ * HTML5-only _whileplaying() etc.
+ * called from both HTML5 native events, and polling/interval-based timers
+ * mimics flash and fires only when time/duration change, so as to be polling-friendly
+ */
+
+ var duration, isNew = false, time, x = {};
+
+ if (_t._hasTimer || bForce) {
+
+ // TODO: May not need to track readyState (1 = loading)
+
+ if (_t._a && (bForce || ((_t.playState > 0 || _t.readyState === 1) && !_t.paused))) {
+
+ duration = _t._get_html5_duration();
+
+ if (duration !== _lastHTML5State.duration) {
+
+ _lastHTML5State.duration = duration;
+ _t.duration = duration;
+ isNew = true;
+
+ }
+
+ // TODO: investigate why this goes wack if not set/re-set each time.
+ _t.durationEstimate = _t.duration;
+
+ time = (_t._a.currentTime * 1000 || 0);
+
+ if (time !== _lastHTML5State.time) {
+
+ _lastHTML5State.time = time;
+ isNew = true;
+
+ }
+
+ if (isNew || bForce) {
+
+ _t._whileplaying(time,x,x,x,x);
+
+ }
+
+ return isNew;
+
+ } else {
+
+ // _s._wD('_onTimer: Warn for "'+_t.sID+'": '+(!_t._a?'Could not find element. ':'')+(_t.playState === 0?'playState bad, 0?':'playState = '+_t.playState+', OK'));
+
+ return false;
+
+ }
+
+ }
+
+ };
+
+ this._get_html5_duration = function() {
+
+ var _iO = _t._iO,
+ d = (_t._a ? _t._a.duration*1000 : (_iO ? _iO.duration : undefined)),
+ result = (d && !isNaN(d) && d !== Infinity ? d : (_iO ? _iO.duration : null));
+
+ return result;
+
+ };
+
+ this._setup_html5 = function(oOptions) {
+
+ var _iO = _mixin(_t._iO, oOptions), d = decodeURI,
+ _a = _useGlobalHTML5Audio ? _s._global_a : _t._a,
+ _dURL = d(_iO.url),
+ _oldIO = (_a && _a._t ? _a._t.instanceOptions : null);
+
+ if (_a) {
+
+ if (_a._t) {
+
+ if (!_useGlobalHTML5Audio && _dURL === d(_lastURL)) {
+ // same url, ignore request
+ return _a;
+ } else if (_useGlobalHTML5Audio && _oldIO.url === _iO.url && (!_lastURL || (_lastURL === _oldIO.url))) {
+ // iOS-type reuse case
+ return _a;
+ }
+
+ }
+
+ _s._wD('setting new URL on existing object: ' + _dURL + (_lastURL ? ', old URL: ' + _lastURL : ''));
+
+ /**
+ * "First things first, I, Poppa.." (reset the previous state of the old sound, if playing)
+ * Fixes case with devices that can only play one sound at a time
+ * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state
+ */
+
+ if (_useGlobalHTML5Audio && _a._t && _a._t.playState && _iO.url !== _oldIO.url) {
+ _a._t.stop();
+ }
+
+ // new URL, so reset load/playstate and so on
+ _resetProperties();
+
+ _a.src = _iO.url;
+ _t.url = _iO.url;
+ _lastURL = _iO.url;
+ _a._called_load = false;
+
+ } else {
+
+ _s._wD('creating HTML5 Audio() element with URL: '+_dURL);
+ _a = new Audio(_iO.url);
+
+ _a._called_load = false;
+
+ // android (seen in 2.3/Honeycomb) sometimes fails first .load() -> .play(), results in playback failure and ended() events?
+ if (_is_android) {
+ _a._called_load = true;
+ }
+
+ if (_useGlobalHTML5Audio) {
+ _s._global_a = _a;
+ }
+
+ }
+
+ _t.isHTML5 = true;
+
+ // store a ref on the track
+ _t._a = _a;
+
+ // store a ref on the audio
+ _a._t = _t;
+
+ _add_html5_events();
+ _a.loop = (_iO.loops>1?'loop':'');
+
+ if (_iO.autoLoad || _iO.autoPlay) {
+
+ _t.load();
+
+ } else {
+
+ // early HTML5 implementation (non-standard)
+ _a.autobuffer = false;
+
+ // standard
+ _a.preload = 'none';
+
+ }
+
+ // boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop
+ _a.loop = (_iO.loops > 1 ? 'loop' : '');
+
+ return _a;
+
+ };
+
+ _add_html5_events = function() {
+
+ if (_t._a._added_events) {
+ return false;
+ }
+
+ var f;
+
+ function add(oEvt, oFn, bCapture) {
+ return _t._a ? _t._a.addEventListener(oEvt, oFn, bCapture||false) : null;
+ }
+
+ _s._wD(_h5+'adding event listeners: '+_t.sID);
+ _t._a._added_events = true;
+
+ for (f in _html5_events) {
+ if (_html5_events.hasOwnProperty(f)) {
+ add(f, _html5_events[f]);
+ }
+ }
+
+ return true;
+
+ };
+
+ _remove_html5_events = function() {
+
+ // Remove event listeners
+
+ var f;
+
+ function remove(oEvt, oFn, bCapture) {
+ return (_t._a ? _t._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
+ }
+
+ _s._wD(_h5+'removing event listeners: '+_t.sID);
+ _t._a._added_events = false;
+
+ for (f in _html5_events) {
+ if (_html5_events.hasOwnProperty(f)) {
+ remove(f, _html5_events[f]);
+ }
+ }
+
+ };
+
+ /**
+ * Pseudo-private event internals
+ * ------------------------------
+ */
+
+ this._onload = function(nSuccess) {
+
+
+ var fN, loadOK = !!(nSuccess);
+ _s._wD(fN + '"' + _t.sID + '"' + (loadOK?' loaded.':' failed to load? - ' + _t.url), (loadOK?1:2));
+
+ // <d>
+ fN = 'SMSound._onload(): ';
+ if (!loadOK && !_t.isHTML5) {
+ if (_s.sandbox.noRemote === true) {
+ _s._wD(fN + _str('noNet'), 1);
+ }
+ if (_s.sandbox.noLocal === true) {
+ _s._wD(fN + _str('noLocal'), 1);
+ }
+ }
+ // </d>
+
+ _t.loaded = loadOK;
+ _t.readyState = loadOK?3:2;
+ _t._onbufferchange(0);
+
+ if (_t._iO.onload) {
+ _t._iO.onload.apply(_t, [loadOK]);
+ }
+
+ return true;
+
+ };
+
+ this._onbufferchange = function(nIsBuffering) {
+
+ if (_t.playState === 0) {
+ // ignore if not playing
+ return false;
+ }
+
+ if ((nIsBuffering && _t.isBuffering) || (!nIsBuffering && !_t.isBuffering)) {
+ return false;
+ }
+
+ _t.isBuffering = (nIsBuffering === 1);
+ if (_t._iO.onbufferchange) {
+ _s._wD('SMSound._onbufferchange(): ' + nIsBuffering);
+ _t._iO.onbufferchange.apply(_t);
+ }
+
+ return true;
+
+ };
+
+ /**
+ * Notify Mobile Safari that user action is required
+ * to continue playing / loading the audio file.
+ */
+
+ this._onsuspend = function() {
+
+ if (_t._iO.onsuspend) {
+ _s._wD('SMSound._onsuspend()');
+ _t._iO.onsuspend.apply(_t);
+ }
+
+ return true;
+
+ };
+
+ /**
+ * flash 9/movieStar + RTMP-only method, should fire only once at most
+ * at this point we just recreate failed sounds rather than trying to reconnect
+ */
+
+ this._onfailure = function(msg, level, code) {
+
+ _t.failures++;
+ _s._wD('SMSound._onfailure(): "'+_t.sID+'" count '+_t.failures);
+
+ if (_t._iO.onfailure && _t.failures === 1) {
+ _t._iO.onfailure(_t, msg, level, code);
+ } else {
+ _s._wD('SMSound._onfailure(): ignoring');
+ }
+
+ };
+
+ this._onfinish = function() {
+
+ // store local copy before it gets trashed..
+ var _io_onfinish = _t._iO.onfinish;
+
+ _t._onbufferchange(0);
+ _t._resetOnPosition(0);
+
+ // reset some state items
+ if (_t.instanceCount) {
+
+ _t.instanceCount--;
+
+ if (!_t.instanceCount) {
+
+ // remove onPosition listeners, if any
+ _detachOnPosition();
+
+ // reset instance options
+ _t.playState = 0;
+ _t.paused = false;
+ _t.instanceCount = 0;
+ _t.instanceOptions = {};
+ _t._iO = {};
+ _stop_html5_timer();
+
+ }
+
+ if (!_t.instanceCount || _t._iO.multiShotEvents) {
+ // fire onfinish for last, or every instance
+ if (_io_onfinish) {
+ _s._wD('SMSound._onfinish(): "' + _t.sID + '"');
+ _io_onfinish.apply(_t);
+ }
+ }
+
+ }
+
+ };
+
+ this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
+
+ var _iO = _t._iO;
+
+ _t.bytesLoaded = nBytesLoaded;
+ _t.bytesTotal = nBytesTotal;
+ _t.duration = Math.floor(nDuration);
+ _t.bufferLength = nBufferLength;
+
+ if (!_iO.isMovieStar) {
+
+ if (_iO.duration) {
+ // use options, if specified and larger
+ _t.durationEstimate = (_t.duration > _iO.duration) ? _t.duration : _iO.duration;
+ } else {
+ _t.durationEstimate = parseInt((_t.bytesTotal / _t.bytesLoaded) * _t.duration, 10);
+
+ }
+
+ if (_t.durationEstimate === undefined) {
+ _t.durationEstimate = _t.duration;
+ }
+
+ if (_t.readyState !== 3 && _iO.whileloading) {
+ _iO.whileloading.apply(_t);
+ }
+
+ } else {
+
+ _t.durationEstimate = _t.duration;
+ if (_t.readyState !== 3 && _iO.whileloading) {
+ _iO.whileloading.apply(_t);
+ }
+
+ }
+
+ };
+
+ this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
+
+ var _iO = _t._iO;
+
+ if (isNaN(nPosition) || nPosition === null) {
+ // flash safety net
+ return false;
+ }
+
+ _t.position = nPosition;
+ _t._processOnPosition();
+
+ if (!_t.isHTML5 && _fV > 8) {
+
+ if (_iO.usePeakData && typeof oPeakData !== 'undefined' && oPeakData) {
+ _t.peakData = {
+ left: oPeakData.leftPeak,
+ right: oPeakData.rightPeak
+ };
+ }
+
+ if (_iO.useWaveformData && typeof oWaveformDataLeft !== 'undefined' && oWaveformDataLeft) {
+ _t.waveformData = {
+ left: oWaveformDataLeft.split(','),
+ right: oWaveformDataRight.split(',')
+ };
+ }
+
+ if (_iO.useEQData) {
+ if (typeof oEQData !== 'undefined' && oEQData && oEQData.leftEQ) {
+ var eqLeft = oEQData.leftEQ.split(',');
+ _t.eqData = eqLeft;
+ _t.eqData.left = eqLeft;
+ if (typeof oEQData.rightEQ !== 'undefined' && oEQData.rightEQ) {
+ _t.eqData.right = oEQData.rightEQ.split(',');
+ }
+ }
+ }
+
+ }
+
+ if (_t.playState === 1) {
+
+ // special case/hack: ensure buffering is false if loading from cache (and not yet started)
+ if (!_t.isHTML5 && _fV === 8 && !_t.position && _t.isBuffering) {
+ _t._onbufferchange(0);
+ }
+
+ if (_iO.whileplaying) {
+ // flash may call after actual finish
+ _iO.whileplaying.apply(_t);
+ }
+
+ }
+
+ return true;
+
+ };
+
+ this._onmetadata = function(oMDProps, oMDData) {
+
+ /**
+ * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature
+ * RTMP may include song title, MovieStar content may include encoding info
+ *
+ * @param {array} oMDProps (names)
+ * @param {array} oMDData (values)
+ */
+
+ _s._wD('SMSound._onmetadata(): "' + this.sID + '" metadata received.');
+
+ var oData = {}, i, j;
+
+ for (i = 0, j = oMDProps.length; i < j; i++) {
+ oData[oMDProps[i]] = oMDData[i];
+ }
+ _t.metadata = oData;
+
+ if (_t._iO.onmetadata) {
+ _t._iO.onmetadata.apply(_t);
+ }
+
+ };
+
+ this._onid3 = function(oID3Props, oID3Data) {
+
+ /**
+ * internal: flash 8 + flash 9 ID3 feature
+ * may include artist, song title etc.
+ *
+ * @param {array} oID3Props (names)
+ * @param {array} oID3Data (values)
+ */
+
+ _s._wD('SMSound._onid3(): "' + this.sID + '" ID3 data received.');
+
+ var oData = [], i, j;
+
+ for (i = 0, j = oID3Props.length; i < j; i++) {
+ oData[oID3Props[i]] = oID3Data[i];
+ }
+ _t.id3 = _mixin(_t.id3, oData);
+
+ if (_t._iO.onid3) {
+ _t._iO.onid3.apply(_t);
+ }
+
+ };
+
+ // flash/RTMP-only
+
+ this._onconnect = function(bSuccess) {
+
+ bSuccess = (bSuccess === 1);
+ _s._wD('SMSound._onconnect(): "'+_t.sID+'"'+(bSuccess?' connected.':' failed to connect? - '+_t.url), (bSuccess?1:2));
+ _t.connected = bSuccess;
+
+ if (bSuccess) {
+
+ _t.failures = 0;
+
+ if (_idCheck(_t.sID)) {
+ if (_t.getAutoPlay()) {
+ // only update the play state if auto playing
+ _t.play(undefined, _t.getAutoPlay());
+ } else if (_t._iO.autoLoad) {
+ _t.load();
+ }
+ }
+
+ if (_t._iO.onconnect) {
+ _t._iO.onconnect.apply(_t, [bSuccess]);
+ }
+
+ }
+
+ };
+
+ this._ondataerror = function(sError) {
+
+ // flash 9 wave/eq data handler
+ // hack: called at start, and end from flash at/after onfinish()
+ if (_t.playState > 0) {
+ _s._wD('SMSound._ondataerror(): ' + sError);
+ if (_t._iO.ondataerror) {
+ _t._iO.ondataerror.apply(_t);
+ }
+ }
+
+ };
+
+ }; // SMSound()
+
+ /**
+ * Private SoundManager internals
+ * ------------------------------
+ */
+
+ _getDocument = function() {
+
+ return (_doc.body || _doc._docElement || _doc.getElementsByTagName('div')[0]);
+
+ };
+
+ _id = function(sID) {
+
+ return _doc.getElementById(sID);
+
+ };
+
+ _mixin = function(oMain, oAdd) {
+
+ // non-destructive merge
+ var o1 = {}, i, o2, o;
+
+ // clone c1
+ for (i in oMain) {
+ if (oMain.hasOwnProperty(i)) {
+ o1[i] = oMain[i];
+ }
+ }
+
+ o2 = (typeof oAdd === 'undefined'?_s.defaultOptions:oAdd);
+ for (o in o2) {
+ if (o2.hasOwnProperty(o) && typeof o1[o] === 'undefined') {
+ o1[o] = o2[o];
+ }
+ }
+ return o1;
+
+ };
+
+ _event = (function() {
+
+ var old = (_win.attachEvent),
+ evt = {
+ add: (old?'attachEvent':'addEventListener'),
+ remove: (old?'detachEvent':'removeEventListener')
+ };
+
+ function getArgs(oArgs) {
+
+ var args = _slice.call(oArgs), len = args.length;
+
+ if (old) {
+ // prefix
+ args[1] = 'on' + args[1];
+ if (len > 3) {
+ // no capture
+ args.pop();
+ }
+ } else if (len === 3) {
+ args.push(false);
+ }
+
+ return args;
+
+ }
+
+ function apply(args, sType) {
+
+ var element = args.shift(),
+ method = [evt[sType]];
+
+ if (old) {
+ element[method](args[0], args[1]);
+ } else {
+ element[method].apply(element, args);
+ }
+
+ }
+
+ function add() {
+
+ apply(getArgs(arguments), 'add');
+
+ }
+
+ function remove() {
+
+ apply(getArgs(arguments), 'remove');
+
+ }
+
+ return {
+ 'add': add,
+ 'remove': remove
+ };
+
+ }());
+
+ /**
+ * Internal HTML5 event handling
+ * -----------------------------
+ */
+
+ function _html5_event(oFn) {
+
+ // wrap html5 event handlers so we don't call them on destroyed sounds
+
+ return function(e) {
+
+ var t = this._t;
+
+ if (!t || !t._a) {
+ // <d>
+ if (t && t.sID) {
+ _s._wD(_h5+'ignoring '+e.type+': '+t.sID);
+ } else {
+ _s._wD(_h5+'ignoring '+e.type);
+ }
+ // </d>
+ return null;
+ } else {
+ return oFn.call(this, e);
+ }
+
+ };
+
+ }
+
+ _html5_events = {
+
+ // HTML5 event-name-to-handler map
+
+ abort: _html5_event(function(e) {
+
+ _s._wD(_h5+'abort: '+this._t.sID);
+
+ }),
+
+ // enough has loaded to play
+
+ canplay: _html5_event(function(e) {
+
+ var t = this._t;
+
+ if (t._html5_canplay) {
+ // this event has already fired. ignore.
+ return true;
+ }
+
+ t._html5_canplay = true;
+ _s._wD(_h5+'canplay: '+t.sID+', '+t.url);
+ t._onbufferchange(0);
+ var position1K = (!isNaN(t.position)?t.position/1000:null);
+
+ // set the position if position was set before the sound loaded
+ if (t.position && this.currentTime !== position1K) {
+ _s._wD(_h5+'canplay: setting position to '+position1K);
+ try {
+ this.currentTime = position1K;
+ } catch(ee) {
+ _s._wD(_h5+'setting position failed: '+ee.message, 2);
+ }
+ }
+
+ // hack for HTML5 from/to case
+ if (t._iO._oncanplay) {
+ t._iO._oncanplay();
+ }
+
+ }),
+
+ load: _html5_event(function(e) {
+
+ var t = this._t;
+
+ if (!t.loaded) {
+ t._onbufferchange(0);
+ // should be 1, and the same
+ t._whileloading(t.bytesTotal, t.bytesTotal, t._get_html5_duration());
+ t._onload(true);
+ }
+
+ }),
+
+ emptied: _html5_event(function(e) {
+
+ _s._wD(_h5+'emptied: '+this._t.sID);
+
+ }),
+
+ ended: _html5_event(function(e) {
+
+ var t = this._t;
+
+ _s._wD(_h5+'ended: '+t.sID);
+ t._onfinish();
+
+ }),
+
+ error: _html5_event(function(e) {
+
+ _s._wD(_h5+'error: '+this.error.code);
+ // call load with error state?
+ this._t._onload(false);
+
+ }),
+
+ loadeddata: _html5_event(function(e) {
+
+ var t = this._t,
+ // at least 1 byte, so math works
+ bytesTotal = t.bytesTotal || 1;
+
+ _s._wD(_h5+'loadeddata: '+this._t.sID);
+
+ // safari seems to nicely report progress events, eventually totalling 100%
+ if (!t._loaded && !_isSafari) {
+ t.duration = t._get_html5_duration();
+ // fire whileloading() with 100% values
+ t._whileloading(bytesTotal, bytesTotal, t._get_html5_duration());
+ t._onload(true);
+ }
+
+ }),
+
+ loadedmetadata: _html5_event(function(e) {
+
+ _s._wD(_h5+'loadedmetadata: '+this._t.sID);
+
+ }),
+
+ loadstart: _html5_event(function(e) {
+
+ _s._wD(_h5+'loadstart: '+this._t.sID);
+ // assume buffering at first
+ this._t._onbufferchange(1);
+
+ }),
+
+ play: _html5_event(function(e) {
+
+ _s._wD(_h5+'play: '+this._t.sID+', '+this._t.url);
+ // once play starts, no buffering
+ this._t._onbufferchange(0);
+
+ }),
+
+ playing: _html5_event(function(e) {
+
+ _s._wD(_h5+'playing: '+this._t.sID);
+
+ // once play starts, no buffering
+ this._t._onbufferchange(0);
+
+ }),
+
+ progress: _html5_event(function(e) {
+
+ var t = this._t;
+
+ if (t.loaded) {
+ return false;
+ }
+
+ var i, j, str, buffered = 0,
+ isProgress = (e.type === 'progress'),
+ ranges = e.target.buffered,
+
+ // firefox 3.6 implements e.loaded/total (bytes)
+ loaded = (e.loaded||0),
+
+ total = (e.total||1);
+
+ if (ranges && ranges.length) {
+
+ // if loaded is 0, try TimeRanges implementation as % of load
+ // https://developer.mozilla.org/en/DOM/TimeRanges
+
+ for (i=ranges.length; i--;) {
+ buffered = (ranges.end(i) - ranges.start(i));
+ }
+
+ // linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges
+ loaded = buffered/e.target.duration;
+
+ // <d>
+ if (isProgress && ranges.length > 1) {
+ str = [];
+ j = ranges.length;
+ for (i=0; i<j; i++) {
+ str.push(e.target.buffered.start(i) +'-'+ e.target.buffered.end(i));
+ }
+ _s._wD(_h5+'progress: timeRanges: '+str.join(', '));
+ }
+
+ if (isProgress && !isNaN(loaded)) {
+ _s._wD(_h5+'progress: '+t.sID+': ' + Math.floor(loaded*100)+'% loaded');
+ }
+ // </d>
+
+ }
+
+ if (!isNaN(loaded)) {
+
+ // if progress, likely not buffering
+ t._onbufferchange(0);
+ t._whileloading(loaded, total, t._get_html5_duration());
+ if (loaded && total && loaded === total) {
+ // in case "onload" doesn't fire (eg. gecko 1.9.2)
+ _html5_events.load.call(this, e);
+ }
+
+ }
+
+ }),
+
+ ratechange: _html5_event(function(e) {
+
+ _s._wD(_h5+'ratechange: '+this._t.sID);
+
+ }),
+
+ suspend: _html5_event(function(e) {
+
+ // download paused/stopped, may have finished (eg. onload)
+ var t = this._t;
+
+ _s._wD(_h5+'suspend: '+t.sID);
+ _html5_events.progress.call(this, e);
+ t._onsuspend();
+
+ }),
+
+ stalled: _html5_event(function(e) {
+
+ _s._wD(_h5+'stalled: '+this._t.sID);
+
+ }),
+
+ timeupdate: _html5_event(function(e) {
+
+ this._t._onTimer();
+
+ }),
+
+ waiting: _html5_event(function(e) {
+
+ var t = this._t;
+
+ // see also: seeking
+ _s._wD(_h5+'waiting: '+t.sID);
+
+ // playback faster than download rate, etc.
+ t._onbufferchange(1);
+
+ })
+
+ };
+
+ _html5OK = function(iO) {
+
+ // Use type, if specified. If HTML5-only mode, no other options, so just give 'er
+ return (!iO.serverURL && (iO.type?_html5CanPlay({type:iO.type}):_html5CanPlay({url:iO.url})||_s.html5Only));
+
+ };
+
+ _html5Unload = function(oAudio) {
+
+ /**
+ * Internal method: Unload media, and cancel any current/pending network requests.
+ * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.
+ * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
+ * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.
+ */
+
+ if (oAudio) {
+ // Firefox likes '' for unload, most other UAs don't and fail to unload.
+ oAudio.src = (_is_firefox ? '' : _emptyURL);
+ }
+
+ };
+
+ _html5CanPlay = function(o) {
+
+ /**
+ * Try to find MIME, test and return truthiness
+ * o = {
+ * url: '/path/to/an.mp3',
+ * type: 'audio/mp3'
+ * }
+ */
+
+ if (!_s.useHTML5Audio || !_s.hasHTML5) {
+ return false;
+ }
+
+ var url = (o.url || null),
+ mime = (o.type || null),
+ aF = _s.audioFormats,
+ result,
+ offset,
+ fileExt,
+ item;
+
+ function preferFlashCheck(kind) {
+
+ // whether flash should play a given type
+ return (_s.preferFlash && _hasFlash && !_s.ignoreFlash && (typeof _s.flash[kind] !== 'undefined' && _s.flash[kind]));
+
+ }
+
+ // account for known cases like audio/mp3
+
+ if (mime && _s.html5[mime] !== 'undefined') {
+ return (_s.html5[mime] && !preferFlashCheck(mime));
+ }
+
+ if (!_html5Ext) {
+ _html5Ext = [];
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ _html5Ext.push(item);
+ if (aF[item].related) {
+ _html5Ext = _html5Ext.concat(aF[item].related);
+ }
+ }
+ }
+ _html5Ext = new RegExp('\\.('+_html5Ext.join('|')+')(\\?.*)?$','i');
+ }
+
+ // TODO: Strip URL queries, etc.
+ fileExt = (url ? url.toLowerCase().match(_html5Ext) : null);
+
+ if (!fileExt || !fileExt.length) {
+ if (!mime) {
+ return false;
+ } else {
+ // audio/mp3 -> mp3, result should be known
+ offset = mime.indexOf(';');
+ // strip "audio/X; codecs.."
+ fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6);
+ }
+ } else {
+ // match the raw extension name - "mp3", for example
+ fileExt = fileExt[1];
+ }
+
+ if (fileExt && typeof _s.html5[fileExt] !== 'undefined') {
+ // result known
+ return (_s.html5[fileExt] && !preferFlashCheck(fileExt));
+ } else {
+ mime = 'audio/'+fileExt;
+ result = _s.html5.canPlayType({type:mime});
+ _s.html5[fileExt] = result;
+ // _s._wD('canPlayType, found result: '+result);
+ return (result && _s.html5[mime] && !preferFlashCheck(mime));
+ }
+
+ };
+
+ _testHTML5 = function() {
+
+ if (!_s.useHTML5Audio || typeof Audio === 'undefined') {
+ return false;
+ }
+
+ // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/
+ var a = (typeof Audio !== 'undefined' ? (_isOpera ? new Audio(null) : new Audio()) : null),
+ item, support = {}, aF, i;
+
+ function _cp(m) {
+
+ var canPlay, i, j, isOK = false;
+
+ if (!a || typeof a.canPlayType !== 'function') {
+ return false;
+ }
+
+ if (m instanceof Array) {
+ // iterate through all mime types, return any successes
+ for (i=0, j=m.length; i<j && !isOK; i++) {
+ if (_s.html5[m[i]] || a.canPlayType(m[i]).match(_s.html5Test)) {
+ isOK = true;
+ _s.html5[m[i]] = true;
+
+ // if flash can play and preferred, also mark it for use.
+ _s.flash[m[i]] = !!(_s.preferFlash && _hasFlash && m[i].match(_flashMIME));
+
+ }
+ }
+ return isOK;
+ } else {
+ canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
+ return !!(canPlay && (canPlay.match(_s.html5Test)));
+ }
+
+ }
+
+ // test all registered formats + codecs
+
+ aF = _s.audioFormats;
+
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ support[item] = _cp(aF[item].type);
+
+ // write back generic type too, eg. audio/mp3
+ support['audio/'+item] = support[item];
+
+ // assign flash
+ if (_s.preferFlash && !_s.ignoreFlash && item.match(_flashMIME)) {
+ _s.flash[item] = true;
+ } else {
+ _s.flash[item] = false;
+ }
+
+ // assign result to related formats, too
+ if (aF[item] && aF[item].related) {
+ for (i=aF[item].related.length; i--;) {
+ // eg. audio/m4a
+ support['audio/'+aF[item].related[i]] = support[item];
+ _s.html5[aF[item].related[i]] = support[item];
+ _s.flash[aF[item].related[i]] = support[item];
+ }
+ }
+ }
+ }
+
+ support.canPlayType = (a?_cp:null);
+ _s.html5 = _mixin(_s.html5, support);
+
+ return true;
+
+ };
+
+ _strings = {
+
+ // <d>
+ notReady: 'Not loaded yet - wait for soundManager.onload()/onready()',
+ notOK: 'Audio support is not available.',
+ domError: _smc + 'createMovie(): appendChild/innerHTML call failed. DOM not ready or other error.',
+ spcWmode: _smc + 'createMovie(): Removing wmode, preventing known SWF loading issue(s)',
+ swf404: _sm + ': Verify that %s is a valid path.',
+ tryDebug: 'Try ' + _sm + '.debugFlash = true for more security details (output goes to SWF.)',
+ checkSWF: 'See SWF output for more debug info.',
+ localFail: _sm + ': Non-HTTP page (' + _doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',
+ waitFocus: _sm + ': Special case: Waiting for focus-related event..',
+ waitImpatient: _sm + ': Getting impatient, still waiting for Flash%s...',
+ waitForever: _sm + ': Waiting indefinitely for Flash (will recover if unblocked)...',
+ needFunction: _sm + ': Function object expected for %s',
+ badID: 'Warning: Sound ID "%s" should be a string, starting with a non-numeric character',
+ currentObj: '--- ' + _sm + '._debug(): Current sound objects ---',
+ waitEI: _smc + 'initMovie(): Waiting for ExternalInterface call from Flash..',
+ waitOnload: _sm + ': Waiting for window.onload()',
+ docLoaded: _sm + ': Document already loaded',
+ onload: _smc + 'initComplete(): calling soundManager.onload()',
+ onloadOK: _sm + '.onload() complete',
+ init: _smc + 'init()',
+ didInit: _smc + 'init(): Already called?',
+ flashJS: _sm + ': Attempting to call Flash from JS..',
+ secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',
+ badRemove: 'Warning: Failed to remove flash movie.',
+ noPeak: 'Warning: peakData features unsupported for movieStar formats',
+ shutdown: _sm + '.disable(): Shutting down',
+ queue: _sm + ': Queueing %s handler',
+ smFail: _sm + ': Failed to initialise.',
+ smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',
+ fbTimeout: 'No flash response, applying .'+_swfCSS.swfTimedout+' CSS..',
+ fbLoaded: 'Flash loaded',
+ fbHandler: _smc+'flashBlockHandler()',
+ manURL: 'SMSound.load(): Using manually-assigned URL',
+ onURL: _sm + '.load(): current URL already assigned.',
+ badFV: _sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',
+ as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',
+ noNSLoop: 'Note: Looping not implemented for MovieStar formats',
+ needfl9: 'Note: Switching to flash 9, required for MP4 formats.',
+ mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',
+ mfOn: 'mobileFlash::enabling on-screen flash repositioning',
+ policy: 'Enabling usePolicyFile for data access'
+ // </d>
+
+ };
+
+ _str = function() {
+
+ // internal string replace helper.
+ // arguments: o [,items to replace]
+ // <d>
+
+ // real array, please
+ var args = _slice.call(arguments),
+
+ // first arg
+ o = args.shift(),
+
+ str = (_strings && _strings[o]?_strings[o]:''), i, j;
+ if (str && args && args.length) {
+ for (i = 0, j = args.length; i < j; i++) {
+ str = str.replace('%s', args[i]);
+ }
+ }
+
+ return str;
+ // </d>
+
+ };
+
+ _loopFix = function(sOpt) {
+
+ // flash 8 requires stream = false for looping to work
+ if (_fV === 8 && sOpt.loops > 1 && sOpt.stream) {
+ _wDS('as2loop');
+ sOpt.stream = false;
+ }
+
+ return sOpt;
+
+ };
+
+ _policyFix = function(sOpt, sPre) {
+
+ if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
+ _s._wD((sPre || '') + _str('policy'));
+ sOpt.usePolicyFile = true;
+ }
+
+ return sOpt;
+
+ };
+
+ _complain = function(sMsg) {
+
+ // <d>
+ if (typeof console !== 'undefined' && typeof console.warn !== 'undefined') {
+ console.warn(sMsg);
+ } else {
+ _s._wD(sMsg);
+ }
+ // </d>
+
+ };
+
+ _doNothing = function() {
+
+ return false;
+
+ };
+
+ _disableObject = function(o) {
+
+ var oProp;
+
+ for (oProp in o) {
+ if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
+ o[oProp] = _doNothing;
+ }
+ }
+
+ oProp = null;
+
+ };
+
+ _failSafely = function(bNoDisable) {
+
+ // general failure exception handler
+
+ if (typeof bNoDisable === 'undefined') {
+ bNoDisable = false;
+ }
+
+ if (_disabled || bNoDisable) {
+ _wDS('smFail', 2);
+ _s.disable(bNoDisable);
+ }
+
+ };
+
+ _normalizeMovieURL = function(smURL) {
+
+ var urlParams = null, url;
+
+ if (smURL) {
+ if (smURL.match(/\.swf(\?.*)?$/i)) {
+ urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
+ if (urlParams) {
+ // assume user knows what they're doing
+ return smURL;
+ }
+ } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
+ // append trailing slash, if needed
+ smURL += '/';
+ }
+ }
+
+ url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + _s.movieURL;
+
+ if (_s.noSWFCache) {
+ url += ('?ts=' + new Date().getTime());
+ }
+
+ return url;
+
+ };
+
+ _setVersionInfo = function() {
+
+ // short-hand for internal use
+
+ _fV = parseInt(_s.flashVersion, 10);
+
+ if (_fV !== 8 && _fV !== 9) {
+ _s._wD(_str('badFV', _fV, _defaultFlashVersion));
+ _s.flashVersion = _fV = _defaultFlashVersion;
+ }
+
+ // debug flash movie, if applicable
+
+ var isDebug = (_s.debugMode || _s.debugFlash?'_debug.swf':'.swf');
+
+ if (_s.useHTML5Audio && !_s.html5Only && _s.audioFormats.mp4.required && _fV < 9) {
+ _s._wD(_str('needfl9'));
+ _s.flashVersion = _fV = 9;
+ }
+
+ _s.version = _s.versionNumber + (_s.html5Only?' (HTML5-only mode)':(_fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
+
+ // set up default options
+ if (_fV > 8) {
+ // +flash 9 base options
+ _s.defaultOptions = _mixin(_s.defaultOptions, _s.flash9Options);
+ _s.features.buffering = true;
+ // +moviestar support
+ _s.defaultOptions = _mixin(_s.defaultOptions, _s.movieStarOptions);
+ _s.filePatterns.flash9 = new RegExp('\\.(mp3|' + _netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
+ _s.features.movieStar = true;
+ } else {
+ _s.features.movieStar = false;
+ }
+
+ // regExp for flash canPlay(), etc.
+ _s.filePattern = _s.filePatterns[(_fV !== 8?'flash9':'flash8')];
+
+ // if applicable, use _debug versions of SWFs
+ _s.movieURL = (_fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug);
+
+ _s.features.peakData = _s.features.waveformData = _s.features.eqData = (_fV > 8);
+
+ };
+
+ _setPolling = function(bPolling, bHighPerformance) {
+
+ if (!_flash) {
+ return false;
+ }
+
+ _flash._setPolling(bPolling, bHighPerformance);
+
+ };
+
+ _initDebug = function() {
+
+ // starts debug mode, creating output <div> for UAs without console object
+
+ // allow force of debug mode via URL
+ if (_s.debugURLParam.test(_wl)) {
+ _s.debugMode = true;
+ }
+
+ // <d>
+ if (_id(_s.debugID)) {
+ return false;
+ }
+
+ var oD, oDebug, oTarget, oToggle, tmp;
+
+ if (_s.debugMode && !_id(_s.debugID) && (!_hasConsole || !_s.useConsole || !_s.consoleOnly)) {
+
+ oD = _doc.createElement('div');
+ oD.id = _s.debugID + '-toggle';
+
+ oToggle = {
+ 'position': 'fixed',
+ 'bottom': '0px',
+ 'right': '0px',
+ 'width': '1.2em',
+ 'height': '1.2em',
+ 'lineHeight': '1.2em',
+ 'margin': '2px',
+ 'textAlign': 'center',
+ 'border': '1px solid #999',
+ 'cursor': 'pointer',
+ 'background': '#fff',
+ 'color': '#333',
+ 'zIndex': 10001
+ };
+
+ oD.appendChild(_doc.createTextNode('-'));
+ oD.onclick = _toggleDebug;
+ oD.title = 'Toggle SM2 debug console';
+
+ if (_ua.match(/msie 6/i)) {
+ oD.style.position = 'absolute';
+ oD.style.cursor = 'hand';
+ }
+
+ for (tmp in oToggle) {
+ if (oToggle.hasOwnProperty(tmp)) {
+ oD.style[tmp] = oToggle[tmp];
+ }
+ }
+
+ oDebug = _doc.createElement('div');
+ oDebug.id = _s.debugID;
+ oDebug.style.display = (_s.debugMode?'block':'none');
+
+ if (_s.debugMode && !_id(oD.id)) {
+ try {
+ oTarget = _getDocument();
+ oTarget.appendChild(oD);
+ } catch(e2) {
+ throw new Error(_str('domError')+' \n'+e2.toString());
+ }
+ oTarget.appendChild(oDebug);
+ }
+
+ }
+
+ oTarget = null;
+ // </d>
+
+ };
+
+ _idCheck = this.getSoundById;
+
+ // <d>
+ _wDS = function(o, errorLevel) {
+
+ if (!o) {
+ return '';
+ } else {
+ return _s._wD(_str(o), errorLevel);
+ }
+
+ };
+
+ // last-resort debugging option
+
+ if (_wl.indexOf('sm2-debug=alert') + 1 && _s.debugMode) {
+ _s._wD = function(sText) {window.alert(sText);};
+ }
+
+ _toggleDebug = function() {
+
+ var o = _id(_s.debugID),
+ oT = _id(_s.debugID + '-toggle');
+
+ if (!o) {
+ return false;
+ }
+
+ if (_debugOpen) {
+ // minimize
+ oT.innerHTML = '+';
+ o.style.display = 'none';
+ } else {
+ oT.innerHTML = '-';
+ o.style.display = 'block';
+ }
+
+ _debugOpen = !_debugOpen;
+
+ };
+
+ _debugTS = function(sEventType, bSuccess, sMessage) {
+
+ // troubleshooter debug hooks
+
+ if (typeof sm2Debugger !== 'undefined') {
+ try {
+ sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);
+ } catch(e) {
+ // oh well
+ }
+ }
+
+ return true;
+
+ };
+ // </d>
+
+ _getSWFCSS = function() {
+
+ var css = [];
+
+ if (_s.debugMode) {
+ css.push(_swfCSS.sm2Debug);
+ }
+
+ if (_s.debugFlash) {
+ css.push(_swfCSS.flashDebug);
+ }
+
+ if (_s.useHighPerformance) {
+ css.push(_swfCSS.highPerf);
+ }
+
+ return css.join(' ');
+
+ };
+
+ _flashBlockHandler = function() {
+
+ // *possible* flash block situation.
+
+ var name = _str('fbHandler'),
+ p = _s.getMoviePercent(),
+ css = _swfCSS,
+ error = {type:'FLASHBLOCK'};
+
+ if (_s.html5Only) {
+ return false;
+ }
+
+ if (!_s.ok()) {
+
+ if (_needsFlash) {
+ // make the movie more visible, so user can fix
+ _s.oMC.className = _getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
+ _s._wD(name+': '+_str('fbTimeout')+(p?' ('+_str('fbLoaded')+')':''));
+ }
+
+ _s.didFlashBlock = true;
+
+ // fire onready(), complain lightly
+ _processOnEvents({type:'ontimeout', ignoreInit:true, error:error});
+ _catchError(error);
+
+ } else {
+
+ // SM2 loaded OK (or recovered)
+
+ // <d>
+ if (_s.didFlashBlock) {
+ _s._wD(name+': Unblocked');
+ }
+ // </d>
+
+ if (_s.oMC) {
+ _s.oMC.className = [_getSWFCSS(), css.swfDefault, css.swfLoaded + (_s.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
+ }
+
+ }
+
+ };
+
+ _addOnEvent = function(sType, oMethod, oScope) {
+
+ if (typeof _on_queue[sType] === 'undefined') {
+ _on_queue[sType] = [];
+ }
+
+ _on_queue[sType].push({
+ 'method': oMethod,
+ 'scope': (oScope || null),
+ 'fired': false
+ });
+
+ };
+
+ _processOnEvents = function(oOptions) {
+
+ // assume onready, if unspecified
+
+ if (!oOptions) {
+ oOptions = {
+ type: 'onready'
+ };
+ }
+
+ if (!_didInit && oOptions && !oOptions.ignoreInit) {
+ // not ready yet.
+ return false;
+ }
+
+ if (oOptions.type === 'ontimeout' && _s.ok()) {
+ // invalid case
+ return false;
+ }
+
+ var status = {
+ success: (oOptions && oOptions.ignoreInit?_s.ok():!_disabled)
+ },
+
+ // queue specified by type, or none
+ srcQueue = (oOptions && oOptions.type?_on_queue[oOptions.type]||[]:[]),
+
+ queue = [], i, j,
+ args = [status],
+ canRetry = (_needsFlash && _s.useFlashBlock && !_s.ok());
+
+ if (oOptions.error) {
+ args[0].error = oOptions.error;
+ }
+
+ for (i = 0, j = srcQueue.length; i < j; i++) {
+ if (srcQueue[i].fired !== true) {
+ queue.push(srcQueue[i]);
+ }
+ }
+
+ if (queue.length) {
+ _s._wD(_sm + ': Firing ' + queue.length + ' '+oOptions.type+'() item' + (queue.length === 1?'':'s'));
+ for (i = 0, j = queue.length; i < j; i++) {
+ if (queue[i].scope) {
+ queue[i].method.apply(queue[i].scope, args);
+ } else {
+ queue[i].method.apply(this, args);
+ }
+ if (!canRetry) {
+ // flashblock case doesn't count here
+ queue[i].fired = true;
+ }
+ }
+ }
+
+ return true;
+
+ };
+
+ _initUserOnload = function() {
+
+ _win.setTimeout(function() {
+
+ if (_s.useFlashBlock) {
+ _flashBlockHandler();
+ }
+
+ _processOnEvents();
+
+ // call user-defined "onload", scoped to window
+
+ if (_s.onload instanceof Function) {
+ _wDS('onload', 1);
+ _s.onload.apply(_win);
+ _wDS('onloadOK', 1);
+ }
+
+ if (_s.waitForWindowLoad) {
+ _event.add(_win, 'load', _initUserOnload);
+ }
+
+ },1);
+
+ };
+
+ _detectFlash = function() {
+
+ // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt
+
+ if (_hasFlash !== undefined) {
+ // this work has already been done.
+ return _hasFlash;
+ }
+
+ var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = _win.ActiveXObject;
+
+ if (nP && nP.length) {
+ type = 'application/x-shockwave-flash';
+ types = n.mimeTypes;
+ if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
+ hasPlugin = true;
+ }
+ } else if (typeof AX !== 'undefined') {
+ try {
+ obj = new AX('ShockwaveFlash.ShockwaveFlash');
+ } catch(e) {
+ // oh well
+ }
+ hasPlugin = (!!obj);
+ }
+
+ _hasFlash = hasPlugin;
+
+ return hasPlugin;
+
+ };
+
+ _featureCheck = function() {
+
+ var needsFlash, item,
+
+ // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (iPad) + iOS4 works.
+ isSpecial = (_is_iDevice && !!(_ua.match(/os (1|2|3_0|3_1)/i)));
+
+ if (isSpecial) {
+
+ // has Audio(), but is broken; let it load links directly.
+ _s.hasHTML5 = false;
+
+ // ignore flash case, however
+ _s.html5Only = true;
+
+ if (_s.oMC) {
+ _s.oMC.style.display = 'none';
+ }
+
+ return false;
+
+ }
+
+ if (_s.useHTML5Audio) {
+
+ if (!_s.html5 || !_s.html5.canPlayType) {
+ _s._wD('SoundManager: No HTML5 Audio() support detected.');
+ _s.hasHTML5 = false;
+ return true;
+ } else {
+ _s.hasHTML5 = true;
+ }
+ if (_isBadSafari) {
+ _s._wD(_smc+'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - '+(!_hasFlash?' would use flash fallback for MP3/MP4, but none detected.':'will use flash fallback for MP3/MP4, if available'),1);
+ if (_detectFlash()) {
+ return true;
+ }
+ }
+ } else {
+
+ // flash needed (or, HTML5 needs enabling.)
+ return true;
+
+ }
+
+ for (item in _s.audioFormats) {
+ if (_s.audioFormats.hasOwnProperty(item)) {
+ if ((_s.audioFormats[item].required && !_s.html5.canPlayType(_s.audioFormats[item].type)) || _s.flash[item] || _s.flash[_s.audioFormats[item].type]) {
+ // flash may be required, or preferred for this format
+ needsFlash = true;
+ }
+ }
+ }
+
+ // sanity check..
+ if (_s.ignoreFlash) {
+ needsFlash = false;
+ }
+
+ _s.html5Only = (_s.hasHTML5 && _s.useHTML5Audio && !needsFlash);
+
+ return (!_s.html5Only);
+
+ };
+
+ _parseURL = function(url) {
+
+ /**
+ * Internal: Finds and returns the first playable URL (or failing that, the first URL.)
+ * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.
+ */
+
+ var i, j, result = 0;
+
+ if (url instanceof Array) {
+
+ // find the first good one
+ for (i=0, j=url.length; i<j; i++) {
+
+ if (url[i] instanceof Object) {
+ // MIME check
+ if (_s.canPlayMIME(url[i].type)) {
+ result = i;
+ break;
+ }
+
+ } else if (_s.canPlayURL(url[i])) {
+ // URL string check
+ result = i;
+ break;
+ }
+
+ }
+
+ // normalize to string
+ if (url[result].url) {
+ url[result] = url[result].url;
+ }
+
+ return url[result];
+
+ } else {
+
+ // single URL case
+ return url;
+
+ }
+
+ };
+
+
+ _startTimer = function(oSound) {
+
+ /**
+ * attach a timer to this sound, and start an interval if needed
+ */
+
+ if (!oSound._hasTimer) {
+
+ oSound._hasTimer = true;
+
+ if (!_likesHTML5 && _s.html5PollingInterval) {
+
+ if (_h5IntervalTimer === null && _h5TimerCount === 0) {
+
+ _h5IntervalTimer = window.setInterval(_timerExecute, _s.html5PollingInterval);
+
+ }
+
+ _h5TimerCount++;
+
+ }
+
+ }
+
+ };
+
+ _stopTimer = function(oSound) {
+
+ /**
+ * detach a timer
+ */
+
+ if (oSound._hasTimer) {
+
+ oSound._hasTimer = false;
+
+ if (!_likesHTML5 && _s.html5PollingInterval) {
+
+ // interval will stop itself at next execution.
+
+ _h5TimerCount--;
+
+ }
+
+ }
+
+ };
+
+ _timerExecute = function() {
+
+ /**
+ * manual polling for HTML5 progress events, ie., whileplaying() (can achieve greater precision than conservative default HTML5 interval)
+ */
+
+ var i, j;
+
+ if (_h5IntervalTimer !== null && !_h5TimerCount) {
+
+ // no active timers, stop polling interval.
+
+ window.clearInterval(_h5IntervalTimer);
+
+ _h5IntervalTimer = null;
+
+ return false;
+
+ }
+
+ // check all HTML5 sounds with timers
+
+ for (i = _s.soundIDs.length; i--;) {
+
+ if (_s.sounds[_s.soundIDs[i]].isHTML5 && _s.sounds[_s.soundIDs[i]]._hasTimer) {
+
+ _s.sounds[_s.soundIDs[i]]._onTimer();
+
+ }
+
+ }
+
+ };
+
+ _catchError = function(options) {
+
+ options = (typeof options !== 'undefined' ? options : {});
+
+ if (_s.onerror instanceof Function) {
+ _s.onerror.apply(_win, [{type:(typeof options.type !== 'undefined' ? options.type : null)}]);
+ }
+
+ if (typeof options.fatal !== 'undefined' && options.fatal) {
+ _s.disable();
+ }
+
+ };
+
+ _badSafariFix = function() {
+
+ // special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4
+ if (!_isBadSafari || !_detectFlash()) {
+ // doesn't apply
+ return false;
+ }
+
+ var aF = _s.audioFormats, i, item;
+
+ for (item in aF) {
+ if (aF.hasOwnProperty(item)) {
+ if (item === 'mp3' || item === 'mp4') {
+ _s._wD(_sm+': Using flash fallback for '+item+' format');
+ _s.html5[item] = false;
+ // assign result to related formats, too
+ if (aF[item] && aF[item].related) {
+ for (i = aF[item].related.length; i--;) {
+ _s.html5[aF[item].related[i]] = false;
+ }
+ }
+ }
+ }
+ }
+
+ };
+
+ /**
+ * Pseudo-private flash/ExternalInterface methods
+ * ----------------------------------------------
+ */
+
+ this._setSandboxType = function(sandboxType) {
+
+ // <d>
+ var sb = _s.sandbox;
+
+ sb.type = sandboxType;
+ sb.description = sb.types[(typeof sb.types[sandboxType] !== 'undefined'?sandboxType:'unknown')];
+
+ _s._wD('Flash security sandbox type: ' + sb.type);
+
+ if (sb.type === 'localWithFile') {
+
+ sb.noRemote = true;
+ sb.noLocal = false;
+ _wDS('secNote', 2);
+
+ } else if (sb.type === 'localWithNetwork') {
+
+ sb.noRemote = false;
+ sb.noLocal = true;
+
+ } else if (sb.type === 'localTrusted') {
+
+ sb.noRemote = false;
+ sb.noLocal = false;
+
+ }
+ // </d>
+
+ };
+
+ this._externalInterfaceOK = function(flashDate, swfVersion) {
+
+ // flash callback confirming flash loaded, EI working etc.
+ // flashDate = approx. timing/delay info for JS/flash bridge
+ // swfVersion: SWF build string
+
+ if (_s.swfLoaded) {
+ return false;
+ }
+
+ var e, eiTime = new Date().getTime();
+
+ _s._wD(_smc+'externalInterfaceOK()' + (flashDate?' (~' + (eiTime - flashDate) + ' ms)':''));
+ _debugTS('swf', true);
+ _debugTS('flashtojs', true);
+ _s.swfLoaded = true;
+ _tryInitOnFocus = false;
+
+ if (_isBadSafari) {
+ _badSafariFix();
+ }
+
+ // complain if JS + SWF build/version strings don't match, excluding +DEV builds
+ // <d>
+ if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== _s.versionNumber.replace(/\+dev/i, '')) {
+
+ e = _sm + ': Fatal: JavaScript file build "' + _s.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + _s.url + '. Ensure both are up-to-date.';
+
+ // escape flash -> JS stack so this error fires in window.
+ setTimeout(function versionMismatch() {
+ throw new Error(e);
+ }, 0);
+
+ // exit, init will fail with timeout
+ return false;
+
+ }
+ // </d>
+
+ if (_isIE) {
+ // IE needs a timeout OR delay until window.onload - may need TODO: investigating
+ setTimeout(_init, 100);
+ } else {
+ _init();
+ }
+
+ };
+
+ /**
+ * Private initialization helpers
+ * ------------------------------
+ */
+
+ _createMovie = function(smID, smURL) {
+
+ if (_didAppend && _appendSuccess) {
+ // ignore if already succeeded
+ return false;
+ }
+
+ function _initMsg() {
+ _s._wD('-- SoundManager 2 ' + _s.version + (!_s.html5Only && _s.useHTML5Audio?(_s.hasHTML5?' + HTML5 audio':', no HTML5 audio support'):'') + (!_s.html5Only ? (_s.useHighPerformance?', high performance mode, ':', ') + (( _s.flashPollingInterval ? 'custom (' + _s.flashPollingInterval + 'ms)' : 'normal') + ' polling') + (_s.wmode?', wmode: ' + _s.wmode:'') + (_s.debugFlash?', flash debug mode':'') + (_s.useFlashBlock?', flashBlock mode':'') : '') + ' --', 1);
+ }
+
+ if (_s.html5Only) {
+
+ // 100% HTML5 mode
+ _setVersionInfo();
+
+ _initMsg();
+ _s.oMC = _id(_s.movieID);
+ _init();
+
+ // prevent multiple init attempts
+ _didAppend = true;
+
+ _appendSuccess = true;
+
+ return false;
+
+ }
+
+ // flash path
+ var remoteURL = (smURL || _s.url),
+ localURL = (_s.altURL || remoteURL),
+ swfTitle = 'JS/Flash audio component (SoundManager 2)',
+ oEmbed, oMovie, oTarget = _getDocument(), tmp, movieHTML, oEl, extraClass = _getSWFCSS(),
+ s, x, sClass, side = 'auto', isRTL = null,
+ html = _doc.getElementsByTagName('html')[0];
+
+ isRTL = (html && html.dir && html.dir.match(/rtl/i));
+ smID = (typeof smID === 'undefined'?_s.id:smID);
+
+ function param(name, value) {
+ return '<param name="'+name+'" value="'+value+'" />';
+ }
+
+ // safety check for legacy (change to Flash 9 URL)
+ _setVersionInfo();
+ _s.url = _normalizeMovieURL("inc/SoundManager2/swf/");
+ smURL = _s.url;
+
+ _s.wmode = (!_s.wmode && _s.useHighPerformance ? 'transparent' : _s.wmode);
+
+ if (_s.wmode !== null && (_ua.match(/msie 8/i) || (!_isIE && !_s.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
+ /**
+ * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here
+ * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout
+ * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)
+ */
+ _wDS('spcWmode');
+ _s.wmode = null;
+ }
+
+ oEmbed = {
+ 'name': smID,
+ 'id': smID,
+ 'src': smURL,
+ 'width': side,
+ 'height': side,
+ 'quality': 'high',
+ 'allowScriptAccess': _s.allowScriptAccess,
+ 'bgcolor': _s.bgColor,
+ 'pluginspage': _http+'www.macromedia.com/go/getflashplayer',
+ 'title': swfTitle,
+ 'type': 'application/x-shockwave-flash',
+ 'wmode': _s.wmode,
+ // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html
+ 'hasPriority': 'true'
+ };
+
+ if (_s.debugFlash) {
+ oEmbed.FlashVars = 'debug=1';
+ }
+
+ if (!_s.wmode) {
+ // don't write empty attribute
+ delete oEmbed.wmode;
+ }
+
+ if (_isIE) {
+
+ // IE is "special".
+ oMovie = _doc.createElement('div');
+ movieHTML = [
+ '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + _http+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="' + oEmbed.width + '" height="' + oEmbed.height + '">',
+ param('movie', smURL),
+ param('AllowScriptAccess', _s.allowScriptAccess),
+ param('quality', oEmbed.quality),
+ (_s.wmode? param('wmode', _s.wmode): ''),
+ param('bgcolor', _s.bgColor),
+ param('hasPriority', 'true'),
+ (_s.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
+ '</object>'
+ ].join('');
+
+ } else {
+
+ oMovie = _doc.createElement('embed');
+ for (tmp in oEmbed) {
+ if (oEmbed.hasOwnProperty(tmp)) {
+ oMovie.setAttribute(tmp, oEmbed[tmp]);
+ }
+ }
+
+ }
+
+ _initDebug();
+ extraClass = _getSWFCSS();
+ oTarget = _getDocument();
+
+ if (oTarget) {
+
+ _s.oMC = (_id(_s.movieID) || _doc.createElement('div'));
+
+ if (!_s.oMC.id) {
+
+ _s.oMC.id = _s.movieID;
+ _s.oMC.className = _swfCSS.swfDefault + ' ' + extraClass;
+ s = null;
+ oEl = null;
+
+ if (!_s.useFlashBlock) {
+ if (_s.useHighPerformance) {
+ // on-screen at all times
+ s = {
+ 'position': 'fixed',
+ 'width': '8px',
+ 'height': '8px',
+ // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.
+ 'bottom': '0px',
+ 'left': '0px',
+ 'overflow': 'hidden'
+ };
+ } else {
+ // hide off-screen, lower priority
+ s = {
+ 'position': 'absolute',
+ 'width': '6px',
+ 'height': '6px',
+ 'top': '-9999px',
+ 'left': '-9999px'
+ };
+ if (isRTL) {
+ s.left = Math.abs(parseInt(s.left,10))+'px';
+ }
+ }
+ }
+
+ if (_isWebkit) {
+ // soundcloud-reported render/crash fix, safari 5
+ _s.oMC.style.zIndex = 10000;
+ }
+
+ if (!_s.debugFlash) {
+ for (x in s) {
+ if (s.hasOwnProperty(x)) {
+ _s.oMC.style[x] = s[x];
+ }
+ }
+ }
+
+ try {
+ if (!_isIE) {
+ _s.oMC.appendChild(oMovie);
+ }
+ oTarget.appendChild(_s.oMC);
+ if (_isIE) {
+ oEl = _s.oMC.appendChild(_doc.createElement('div'));
+ oEl.className = _swfCSS.swfBox;
+ oEl.innerHTML = movieHTML;
+ }
+ _appendSuccess = true;
+ } catch(e) {
+ throw new Error(_str('domError')+' \n'+e.toString());
+ }
+
+ } else {
+
+ // SM2 container is already in the document (eg. flashblock use case)
+ sClass = _s.oMC.className;
+ _s.oMC.className = (sClass?sClass+' ':_swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
+ _s.oMC.appendChild(oMovie);
+ if (_isIE) {
+ oEl = _s.oMC.appendChild(_doc.createElement('div'));
+ oEl.className = _swfCSS.swfBox;
+ oEl.innerHTML = movieHTML;
+ }
+ _appendSuccess = true;
+
+ }
+
+ }
+
+ _didAppend = true;
+ _initMsg();
+ _s._wD(_smc+'createMovie(): Trying to load ' + smURL + (!_overHTTP && _s.altURL?' (alternate URL)':''), 1);
+
+ return true;
+
+ };
+
+ _initMovie = function() {
+
+ if (_s.html5Only) {
+ _createMovie();
+ return false;
+ }
+
+ // attempt to get, or create, movie
+ // may already exist
+ if (_flash) {
+ return false;
+ }
+
+ // inline markup case
+ _flash = _s.getMovie(_s.id);
+
+ if (!_flash) {
+ if (!_oRemoved) {
+ // try to create
+ _createMovie(_s.id, _s.url);
+ } else {
+ // try to re-append removed movie after reboot()
+ if (!_isIE) {
+ _s.oMC.appendChild(_oRemoved);
+ } else {
+ _s.oMC.innerHTML = _oRemovedHTML;
+ }
+ _oRemoved = null;
+ _didAppend = true;
+ }
+ _flash = _s.getMovie(_s.id);
+ }
+
+ // <d>
+ if (_flash) {
+ _wDS('waitEI');
+ }
+ // </d>
+
+ if (_s.oninitmovie instanceof Function) {
+ setTimeout(_s.oninitmovie, 1);
+ }
+
+ return true;
+
+ };
+
+ _delayWaitForEI = function() {
+
+ setTimeout(_waitForEI, 1000);
+
+ };
+
+ _waitForEI = function() {
+
+ if (_waitingForEI) {
+ return false;
+ }
+
+ _waitingForEI = true;
+ _event.remove(_win, 'load', _delayWaitForEI);
+
+ if (_tryInitOnFocus && !_isFocused) {
+ // giant Safari 3.1 hack - assume mousemove = focus given lack of focus event
+ _wDS('waitFocus');
+ return false;
+ }
+
+ var p;
+ if (!_didInit) {
+ p = _s.getMoviePercent();
+ _s._wD(_str('waitImpatient', (p === 100?' (SWF loaded)':(p > 0?' (SWF ' + p + '% loaded)':''))));
+ }
+
+ setTimeout(function() {
+
+ p = _s.getMoviePercent();
+
+ // <d>
+ if (!_didInit) {
+ _s._wD(_sm + ': No Flash response within expected time.\nLikely causes: ' + (p === 0?'Loading ' + _s.movieURL + ' may have failed (and/or Flash ' + _fV + '+ not present?), ':'') + 'Flash blocked or JS-Flash security error.' + (_s.debugFlash?' ' + _str('checkSWF'):''), 2);
+ if (!_overHTTP && p) {
+ _wDS('localFail', 2);
+ if (!_s.debugFlash) {
+ _wDS('tryDebug', 2);
+ }
+ }
+ if (p === 0) {
+ // if 0 (not null), probably a 404.
+ _s._wD(_str('swf404', _s.url));
+ }
+ _debugTS('flashtojs', false, ': Timed out' + _overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)');
+ }
+ // </d>
+
+ // give up / time-out, depending
+
+ if (!_didInit && _okToDisable) {
+ if (p === null) {
+ // SWF failed. Maybe blocked.
+ if (_s.useFlashBlock || _s.flashLoadTimeout === 0) {
+ if (_s.useFlashBlock) {
+ _flashBlockHandler();
+ }
+ _wDS('waitForever');
+ } else {
+ // old SM2 behaviour, simply fail
+ _failSafely(true);
+ }
+ } else {
+ // flash loaded? Shouldn't be a blocking issue, then.
+ if (_s.flashLoadTimeout === 0) {
+ _wDS('waitForever');
+ } else {
+ _failSafely(true);
+ }
+ }
+ }
+
+ }, _s.flashLoadTimeout);
+
+ };
+
+ _handleFocus = function() {
+
+ function cleanup() {
+ _event.remove(_win, 'focus', _handleFocus);
+ _event.remove(_win, 'load', _handleFocus);
+ }
+
+ if (_isFocused || !_tryInitOnFocus) {
+ cleanup();
+ return true;
+ }
+
+ _okToDisable = true;
+ _isFocused = true;
+ _s._wD(_smc+'handleFocus()');
+
+ if (_isSafari && _tryInitOnFocus) {
+ _event.remove(_win, 'mousemove', _handleFocus);
+ }
+
+ // allow init to restart
+ _waitingForEI = false;
+
+ cleanup();
+ return true;
+
+ };
+
+ _showSupport = function() {
+
+ var item, tests = [];
+
+ if (_s.useHTML5Audio && _s.hasHTML5) {
+ for (item in _s.audioFormats) {
+ if (_s.audioFormats.hasOwnProperty(item)) {
+ tests.push(item + ': ' + _s.html5[item] + (!_s.html5[item] && _hasFlash && _s.flash[item] ? ' (using flash)' : (_s.preferFlash && _s.flash[item] && _hasFlash ? ' (preferring flash)': (!_s.html5[item] ? ' (' + (_s.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
+ }
+ }
+ _s._wD('-- SoundManager 2: HTML5 support tests ('+_s.html5Test+'): '+tests.join(', ')+' --',1);
+ }
+
+ };
+
+ _initComplete = function(bNoDisable) {
+
+ if (_didInit) {
+ return false;
+ }
+
+ if (_s.html5Only) {
+ // all good.
+ _s._wD('-- SoundManager 2: loaded --');
+ _didInit = true;
+ _initUserOnload();
+ _debugTS('onload', true);
+ return true;
+ }
+
+ var wasTimeout = (_s.useFlashBlock && _s.flashLoadTimeout && !_s.getMoviePercent()),
+ error;
+
+ if (!wasTimeout) {
+ _didInit = true;
+ if (_disabled) {
+ error = {type: (!_hasFlash && _needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
+ }
+ }
+
+ _s._wD('-- SoundManager 2 ' + (_disabled?'failed to load':'loaded') + ' (' + (_disabled?'security/load error':'OK') + ') --', 1);
+
+ if (_disabled || bNoDisable) {
+ if (_s.useFlashBlock && _s.oMC) {
+ _s.oMC.className = _getSWFCSS() + ' ' + (_s.getMoviePercent() === null?_swfCSS.swfTimedout:_swfCSS.swfError);
+ }
+ _processOnEvents({type:'ontimeout', error:error});
+ _debugTS('onload', false);
+ _catchError(error);
+ return false;
+ } else {
+ _debugTS('onload', true);
+ }
+
+ if (_s.waitForWindowLoad && !_windowLoaded) {
+ _wDS('waitOnload');
+ _event.add(_win, 'load', _initUserOnload);
+ return false;
+ } else {
+ // <d>
+ if (_s.waitForWindowLoad && _windowLoaded) {
+ _wDS('docLoaded');
+ }
+ // </d>
+ _initUserOnload();
+ }
+
+ return true;
+
+ };
+
+ _init = function() {
+
+ _wDS('init');
+
+ // called after onload()
+
+ if (_didInit) {
+ _wDS('didInit');
+ return false;
+ }
+
+ function _cleanup() {
+ _event.remove(_win, 'load', _s.beginDelayedInit);
+ }
+
+ if (_s.html5Only) {
+ if (!_didInit) {
+ // we don't need no steenking flash!
+ _cleanup();
+ _s.enabled = true;
+ _initComplete();
+ }
+ return true;
+ }
+
+ // flash path
+ _initMovie();
+
+ try {
+
+ _wDS('flashJS');
+
+ // attempt to talk to Flash
+ _flash._externalInterfaceTest(false);
+
+ // apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling
+ // (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)
+ _setPolling(true, (_s.flashPollingInterval || (_s.useHighPerformance ? 10 : 50)));
+
+ if (!_s.debugMode) {
+ // stop the SWF from making debug output calls to JS
+ _flash._disableDebug();
+ }
+
+ _s.enabled = true;
+ _debugTS('jstoflash', true);
+
+ if (!_s.html5Only) {
+ // prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead
+ // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
+ _event.add(_win, 'unload', _doNothing);
+ }
+
+ } catch(e) {
+
+ _s._wD('js/flash exception: ' + e.toString());
+ _debugTS('jstoflash', false);
+ _catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
+ // don't disable, for reboot()
+ _failSafely(true);
+ _initComplete();
+
+ return false;
+
+ }
+
+ _initComplete();
+
+ // disconnect events
+ _cleanup();
+
+ return true;
+
+ };
+
+ _domContentLoaded = function() {
+
+ if (_didDCLoaded) {
+ return false;
+ }
+
+ _didDCLoaded = true;
+ _initDebug();
+
+ /**
+ * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1
+ * Ditto for sm2-preferFlash, too.
+ */
+ // <d>
+ (function(){
+
+ var a = 'sm2-usehtml5audio=', l = _wl.toLowerCase(), b = null,
+ a2 = 'sm2-preferflash=', b2 = null, hasCon = (typeof console !== 'undefined' && typeof console.log !== 'undefined');
+
+ if (l.indexOf(a) !== -1) {
+ b = (l.charAt(l.indexOf(a)+a.length) === '1');
+ if (hasCon) {
+ console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter');
+ }
+ _s.useHTML5Audio = b;
+ }
+
+ if (l.indexOf(a2) !== -1) {
+ b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1');
+ if (hasCon) {
+ console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter');
+ }
+ _s.preferFlash = b2;
+ }
+
+ }());
+ // </d>
+
+ if (!_hasFlash && _s.hasHTML5) {
+ _s._wD('SoundManager: No Flash detected'+(!_s.useHTML5Audio?', enabling HTML5.':'. Trying HTML5-only mode.'));
+ _s.useHTML5Audio = true;
+ // make sure we aren't preferring flash, either
+ // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.
+ _s.preferFlash = false;
+ }
+
+ _testHTML5();
+ _s.html5.usingFlash = _featureCheck();
+ _needsFlash = _s.html5.usingFlash;
+ _showSupport();
+
+ if (!_hasFlash && _needsFlash) {
+ _s._wD('SoundManager: Fatal error: Flash is needed to play some required formats, but is not available.');
+ // TODO: Fatal here vs. timeout approach, etc.
+ // hack: fail sooner.
+ _s.flashLoadTimeout = 1;
+ }
+
+ if (_doc.removeEventListener) {
+ _doc.removeEventListener('DOMContentLoaded', _domContentLoaded, false);
+ }
+
+ _initMovie();
+ return true;
+
+ };
+
+ _domContentLoadedIE = function() {
+
+ if (_doc.readyState === 'complete') {
+ _domContentLoaded();
+ _doc.detachEvent('onreadystatechange', _domContentLoadedIE);
+ }
+
+ return true;
+
+ };
+
+ _winOnLoad = function() {
+ // catch edge case of _initComplete() firing after window.load()
+ _windowLoaded = true;
+ _event.remove(_win, 'load', _winOnLoad);
+ };
+
+ // sniff up-front
+ _detectFlash();
+
+ // focus and window load, init (primarily flash-driven)
+ _event.add(_win, 'focus', _handleFocus);
+ _event.add(_win, 'load', _handleFocus);
+ _event.add(_win, 'load', _delayWaitForEI);
+ _event.add(_win, 'load', _winOnLoad);
+
+
+ if (_isSafari && _tryInitOnFocus) {
+ // massive Safari 3.1 focus detection hack
+ _event.add(_win, 'mousemove', _handleFocus);
+ }
+
+ if (_doc.addEventListener) {
+
+ _doc.addEventListener('DOMContentLoaded', _domContentLoaded, false);
+
+ } else if (_doc.attachEvent) {
+
+ _doc.attachEvent('onreadystatechange', _domContentLoadedIE);
+
+ } else {
+
+ // no add/attachevent support - safe to assume no JS -> Flash either
+ _debugTS('onload', false);
+ _catchError({type:'NO_DOM2_EVENTS', fatal:true});
+
+ }
+
+ if (_doc.readyState === 'complete') {
+ // DOMReady has already happened.
+ setTimeout(_domContentLoaded,100);
+ }
+
+} // SoundManager()
+
+// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading
+
+if (typeof SM2_DEFER === 'undefined' || !SM2_DEFER) {
+ soundManager = new SoundManager();
+}
+
+/**
+ * SoundManager public interfaces
+ * ------------------------------
+ */
+
+window.SoundManager = SoundManager; // constructor
+window.soundManager = soundManager; // public API, flash callbacks etc.
+
+}(window)); \ No newline at end of file
diff --git a/Processing-js/libs/inc/SoundManager2/swf/soundmanager2.swf b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2.swf
new file mode 100755
index 0000000..14850f2
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2.swf
Binary files differ
diff --git a/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_debug.swf b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_debug.swf
new file mode 100755
index 0000000..aa4750a
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_debug.swf
Binary files differ
diff --git a/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9.swf b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9.swf
new file mode 100755
index 0000000..2705986
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9.swf
Binary files differ
diff --git a/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf
new file mode 100755
index 0000000..243d649
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash9_debug.swf
Binary files differ
diff --git a/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip
new file mode 100755
index 0000000..29737aa
--- /dev/null
+++ b/Processing-js/libs/inc/SoundManager2/swf/soundmanager2_flash_xdomain.zip
Binary files differ
diff --git a/Processing-js/libs/inc/WebMIDIAPI.js b/Processing-js/libs/inc/WebMIDIAPI.js
new file mode 100644
index 0000000..2b3d6f2
--- /dev/null
+++ b/Processing-js/libs/inc/WebMIDIAPI.js
@@ -0,0 +1,421 @@
+/* Copyright 2013 Chris Wilson
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+// Initialize the MIDI library.
+(function (global) {
+ 'use strict';
+ var midiIO, _requestMIDIAccess, MIDIAccess, _onReady, MIDIPort, MIDIInput, MIDIOutput, _midiProc;
+
+ function Promise() {
+
+ }
+
+ Promise.prototype.then = function(accept, reject) {
+ this.accept = accept;
+ this.reject = reject;
+ }
+
+ Promise.prototype.succeed = function(access) {
+ if (this.accept)
+ this.accept(access);
+ }
+
+ Promise.prototype.fail = function(error) {
+ if (this.reject)
+ this.reject(error);
+ }
+
+ function _JazzInstance() {
+ this.inputInUse = false;
+ this.outputInUse = false;
+
+ // load the Jazz plugin
+ var o1 = document.createElement("object");
+ o1.id = "_Jazz" + Math.random() + "ie";
+ o1.classid = "CLSID:1ACE1618-1C7D-4561-AEE1-34842AA85E90";
+
+ this.activeX = o1;
+
+ var o2 = document.createElement("object");
+ o2.id = "_Jazz" + Math.random();
+ o2.type="audio/x-jazz";
+ o1.appendChild(o2);
+
+ this.objRef = o2;
+
+ var e = document.createElement("p");
+ e.appendChild(document.createTextNode("This page requires the "));
+
+ var a = document.createElement("a");
+ a.appendChild(document.createTextNode("Jazz plugin"));
+ a.href = "http://jazz-soft.net/";
+
+ e.appendChild(a);
+ e.appendChild(document.createTextNode("."));
+ o2.appendChild(e);
+
+ var insertionPoint = document.getElementById("MIDIPlugin");
+ if (!insertionPoint) {
+ // Create hidden element
+ var insertionPoint = document.createElement("div");
+ insertionPoint.id = "MIDIPlugin";
+ insertionPoint.style.position = "absolute";
+ insertionPoint.style.visibility = "hidden";
+ insertionPoint.style.left = "-9999px";
+ insertionPoint.style.top = "-9999px";
+ document.body.appendChild(insertionPoint);
+ }
+ insertionPoint.appendChild(o1);
+
+ if (this.objRef.isJazz)
+ this._Jazz = this.objRef;
+ else if (this.activeX.isJazz)
+ this._Jazz = this.activeX;
+ else
+ this._Jazz = null;
+ if (this._Jazz) {
+ this._Jazz._jazzTimeZero = this._Jazz.Time();
+ this._Jazz._perfTimeZero = window.performance.now();
+ }
+ }
+
+ _requestMIDIAccess = function _requestMIDIAccess() {
+ var access = new MIDIAccess();
+ return access._promise;
+ };
+
+ // API Methods
+
+ function MIDIAccess() {
+ this._jazzInstances = new Array();
+ this._jazzInstances.push( new _JazzInstance() );
+ this._promise = new Promise;
+
+ if (this._jazzInstances[0]._Jazz) {
+ this._Jazz = this._jazzInstances[0]._Jazz;
+ window.setTimeout( _onReady.bind(this), 3 );
+ } else {
+ window.setTimeout( _onNotReady.bind(this), 3 );
+ }
+ };
+
+ _onReady = function _onReady() {
+ if (this._promise)
+ this._promise.succeed(this);
+ };
+
+ function _onNotReady() {
+ if (this._promise)
+ this._promise.fail( { code: 1 } );
+ };
+
+ MIDIAccess.prototype.inputs = function( ) {
+ if (!this._Jazz)
+ return null;
+ var list=this._Jazz.MidiInList();
+ var inputs = new Array( list.length );
+
+ for ( var i=0; i<list.length; i++ ) {
+ inputs[i] = new MIDIInput( this, list[i], i );
+ }
+ return inputs;
+ }
+
+ MIDIAccess.prototype.outputs = function( ) {
+ if (!this._Jazz)
+ return null;
+ var list=this._Jazz.MidiOutList();
+ var outputs = new Array( list.length );
+
+ for ( var i=0; i<list.length; i++ ) {
+ outputs[i] = new MIDIOutput( this, list[i], i );
+ }
+ return outputs;
+ };
+
+ MIDIInput = function MIDIInput( midiAccess, name, index ) {
+ this._listeners = [];
+ this._midiAccess = midiAccess;
+ this._index = index;
+ this._inLongSysexMessage = false;
+ this._sysexBuffer = new Uint8Array();
+ this.id = "" + index + "." + name;
+ this.manufacturer = "";
+ this.name = name;
+ this.type = "input";
+ this.version = "";
+ this.onmidimessage = null;
+
+ var inputInstance = null;
+ for (var i=0; (i<midiAccess._jazzInstances.length)&&(!inputInstance); i++) {
+ if (!midiAccess._jazzInstances[i].inputInUse)
+ inputInstance=midiAccess._jazzInstances[i];
+ }
+ if (!inputInstance) {
+ inputInstance = new _JazzInstance();
+ midiAccess._jazzInstances.push( inputInstance );
+ }
+ inputInstance.inputInUse = true;
+
+ this._jazzInstance = inputInstance._Jazz;
+ this._input = this._jazzInstance.MidiInOpen( this._index, _midiProc.bind(this) );
+ };
+
+ // Introduced in DOM Level 2:
+ MIDIInput.prototype.addEventListener = function (type, listener, useCapture ) {
+ if (type !== "midimessage")
+ return;
+ for (var i=0; i<this._listeners.length; i++)
+ if (this._listeners[i] == listener)
+ return;
+ this._listeners.push( listener );
+ };
+
+ MIDIInput.prototype.removeEventListener = function (type, listener, useCapture ) {
+ if (type !== "midimessage")
+ return;
+ for (var i=0; i<this._listeners.length; i++)
+ if (this._listeners[i] == listener) {
+ this._listeners.splice( i, 1 ); //remove it
+ return;
+ }
+ };
+
+ MIDIInput.prototype.preventDefault = function() {
+ this._pvtDef = true;
+ };
+
+ MIDIInput.prototype.dispatchEvent = function (evt) {
+ this._pvtDef = false;
+
+ // dispatch to listeners
+ for (var i=0; i<this._listeners.length; i++)
+ if (this._listeners[i].handleEvent)
+ this._listeners[i].handleEvent.bind(this)( evt );
+ else
+ this._listeners[i].bind(this)( evt );
+
+ if (this.onmidimessage)
+ this.onmidimessage( evt );
+
+ return this._pvtDef;
+ };
+
+ MIDIInput.prototype.appendToSysexBuffer = function ( data ) {
+ var oldLength = this._sysexBuffer.length;
+ var tmpBuffer = new Uint8Array( oldLength + data.length );
+ tmpBuffer.set( this._sysexBuffer );
+ tmpBuffer.set( data, oldLength );
+ this._sysexBuffer = tmpBuffer;
+ };
+
+ MIDIInput.prototype.bufferLongSysex = function ( data, initialOffset ) {
+ var j = initialOffset;
+ while (j<data.length) {
+ if (data[j] == 0xF7) {
+ // end of sysex!
+ j++;
+ this.appendToSysexBuffer( data.slice(initialOffset, j) );
+ return j;
+ }
+ j++;
+ }
+ // didn't reach the end; just tack it on.
+ this.appendToSysexBuffer( data.slice(initialOffset, j) );
+ this._inLongSysexMessage = true;
+ return j;
+ };
+
+ _midiProc = function _midiProc( timestamp, data ) {
+ // Have to use createEvent/initEvent because IE10 fails on new CustomEvent. Thanks, IE!
+ var length = 0;
+ var i,j;
+ var isSysexMessage = false;
+
+ // Jazz sometimes passes us multiple messages at once, so we need to parse them out
+ // and pass them one at a time.
+
+ for (i=0; i<data.length; i+=length) {
+ if (this._inLongSysexMessage) {
+ i = this.bufferLongSysex(data,i);
+ if ( data[i-1] != 0xf7 ) {
+ // ran off the end without hitting the end of the sysex message
+ return;
+ }
+ isSysexMessage = true;
+ } else {
+ isSysexMessage = false;
+ switch (data[i] & 0xF0) {
+ case 0x80: // note off
+ case 0x90: // note on
+ case 0xA0: // polyphonic aftertouch
+ case 0xB0: // control change
+ case 0xE0: // channel mode
+ length = 3;
+ break;
+
+ case 0xC0: // program change
+ case 0xD0: // channel aftertouch
+ length = 2;
+ break;
+
+ case 0xF0:
+ switch (data[i]) {
+ case 0xf0: // variable-length sysex.
+ i = this.bufferLongSysex(data,i);
+ if ( data[i-1] != 0xf7 ) {
+ // ran off the end without hitting the end of the sysex message
+ return;
+ }
+ isSysexMessage = true;
+ break;
+
+ case 0xF1: // MTC quarter frame
+ case 0xF3: // song select
+ length = 2;
+ break;
+
+ case 0xF2: // song position pointer
+ length = 3;
+ break;
+
+ default:
+ length = 1;
+ break;
+ }
+ break;
+ }
+ }
+ var evt = document.createEvent( "Event" );
+ evt.initEvent( "midimessage", false, false );
+ evt.receivedTime = parseFloat( timestamp.toString()) + this._jazzInstance._perfTimeZero;
+ if (isSysexMessage || this._inLongSysexMessage) {
+ evt.data = new Uint8Array( this._sysexBuffer );
+ this._sysexBuffer = new Uint8Array(0);
+ this._inLongSysexMessage = false;
+ } else
+ evt.data = new Uint8Array(data.slice(i, length+i));
+ this.dispatchEvent( evt );
+ }
+ };
+
+ MIDIOutput = function MIDIOutput( midiAccess, name, index ) {
+ this._listeners = [];
+ this._midiAccess = midiAccess;
+ this._index = index;
+ this.id = "" + index + "." + name;
+ this.manufacturer = "";
+ this.name = name;
+ this.type = "output";
+ this.version = "";
+
+ var outputInstance = null;
+ for (var i=0; (i<midiAccess._jazzInstances.length)&&(!outputInstance); i++) {
+ if (!midiAccess._jazzInstances[i].outputInUse)
+ outputInstance=midiAccess._jazzInstances[i];
+ }
+ if (!outputInstance) {
+ outputInstance = new _JazzInstance();
+ midiAccess._jazzInstances.push( outputInstance );
+ }
+ outputInstance.outputInUse = true;
+
+ this._jazzInstance = outputInstance._Jazz;
+ this._jazzInstance.MidiOutOpen(this.name);
+ };
+
+ function _sendLater() {
+ this.jazz.MidiOutLong( this.data ); // handle send as sysex
+ }
+
+ MIDIOutput.prototype.send = function( data, timestamp ) {
+ var delayBeforeSend = 0;
+ if (data.length === 0)
+ return false;
+
+ if (timestamp)
+ delayBeforeSend = Math.floor( timestamp - window.performance.now() );
+
+ if (timestamp && (delayBeforeSend>1)) {
+ var sendObj = new Object();
+ sendObj.jazz = this._jazzInstance;
+ sendObj.data = data;
+
+ window.setTimeout( _sendLater.bind(sendObj), delayBeforeSend );
+ } else {
+ this._jazzInstance.MidiOutLong( data );
+ }
+ return true;
+ };
+
+ //init: create plugin
+ if (!window.navigator.requestMIDIAccess)
+ window.navigator.requestMIDIAccess = _requestMIDIAccess;
+
+}(window));
+
+// Polyfill window.performance.now() if necessary.
+(function (exports) {
+ var perf = {}, props;
+
+ function findAlt() {
+ var prefix = ['moz', 'webkit', 'o', 'ms'],
+ i = prefix.length,
+ //worst case, we use Date.now()
+ props = {
+ value: (function (start) {
+ return function () {
+ return Date.now() - start;
+ };
+ }(Date.now()))
+ };
+
+ //seach for vendor prefixed version
+ for (; i >= 0; i--) {
+ if ((prefix[i] + "Now") in exports.performance) {
+ props.value = function (method) {
+ return function () {
+ exports.performance[method]();
+ }
+ }(prefix[i] + "Now");
+ return props;
+ }
+ }
+
+ //otherwise, try to use connectionStart
+ if ("timing" in exports.performance && "connectStart" in exports.performance.timing) {
+ //this pretty much approximates performance.now() to the millisecond
+ props.value = (function (start) {
+ return function() {
+ Date.now() - start;
+ };
+ }(exports.performance.timing.connectStart));
+ }
+ return props;
+ }
+
+ //if already defined, bail
+ if (("performance" in exports) && ("now" in exports.performance))
+ return;
+ if (!("performance" in exports))
+ Object.defineProperty(exports, "performance", {
+ get: function () {
+ return perf;
+ }});
+ //otherwise, performance is there, but not "now()"
+
+ props = findAlt();
+ Object.defineProperty(exports.performance, "now", props);
+}(window)); \ No newline at end of file
diff --git a/Processing-js/libs/inc/base64binary.js b/Processing-js/libs/inc/base64binary.js
new file mode 100644
index 0000000..6e1e558
--- /dev/null
+++ b/Processing-js/libs/inc/base64binary.js
@@ -0,0 +1,80 @@
+/*
+Copyright (c) 2011, Daniel Guerrero
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the Daniel Guerrero nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL DANIEL GUERRERO BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+var Base64Binary = {
+ _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+
+ /* will return a Uint8Array type */
+ decodeArrayBuffer: function(input) {
+ var bytes = Math.ceil( (3*input.length) / 4.0);
+ var ab = new ArrayBuffer(bytes);
+ this.decode(input, ab);
+
+ return ab;
+ },
+
+ decode: function(input, arrayBuffer) {
+ //get last chars to see if are valid
+ var lkey1 = this._keyStr.indexOf(input.charAt(input.length-1));
+ var lkey2 = this._keyStr.indexOf(input.charAt(input.length-1));
+
+ var bytes = Math.ceil( (3*input.length) / 4.0);
+ if (lkey1 == 64) bytes--; //padding chars, so skip
+ if (lkey2 == 64) bytes--; //padding chars, so skip
+
+ var uarray;
+ var chr1, chr2, chr3;
+ var enc1, enc2, enc3, enc4;
+ var i = 0;
+ var j = 0;
+
+ if (arrayBuffer)
+ uarray = new Uint8Array(arrayBuffer);
+ else
+ uarray = new Uint8Array(bytes);
+
+ input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+
+ for (i=0; i<bytes; i+=3) {
+ //get the 3 octects in 4 ascii chars
+ enc1 = this._keyStr.indexOf(input.charAt(j++));
+ enc2 = this._keyStr.indexOf(input.charAt(j++));
+ enc3 = this._keyStr.indexOf(input.charAt(j++));
+ enc4 = this._keyStr.indexOf(input.charAt(j++));
+
+ chr1 = (enc1 << 2) | (enc2 >> 4);
+ chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+ chr3 = ((enc3 & 3) << 6) | enc4;
+
+ uarray[i] = chr1;
+ if (enc3 != 64) uarray[i+1] = chr2;
+ if (enc4 != 64) uarray[i+2] = chr3;
+ }
+
+ return uarray;
+ }
+}; \ No newline at end of file
diff --git a/Processing-js/libs/inc/jasmid/LICENSE b/Processing-js/libs/inc/jasmid/LICENSE
new file mode 100644
index 0000000..407a442
--- /dev/null
+++ b/Processing-js/libs/inc/jasmid/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2010, Matt Westcott & Ben Firshman
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * The names of its contributors may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Processing-js/libs/inc/jasmid/midifile.js b/Processing-js/libs/inc/jasmid/midifile.js
new file mode 100644
index 0000000..5e60e79
--- /dev/null
+++ b/Processing-js/libs/inc/jasmid/midifile.js
@@ -0,0 +1,238 @@
+/*
+class to parse the .mid file format
+(depends on stream.js)
+*/
+function MidiFile(data) {
+ function readChunk(stream) {
+ var id = stream.read(4);
+ var length = stream.readInt32();
+ return {
+ 'id': id,
+ 'length': length,
+ 'data': stream.read(length)
+ };
+ }
+
+ var lastEventTypeByte;
+
+ function readEvent(stream) {
+ var event = {};
+ event.deltaTime = stream.readVarInt();
+ var eventTypeByte = stream.readInt8();
+ if ((eventTypeByte & 0xf0) == 0xf0) {
+ /* system / meta event */
+ if (eventTypeByte == 0xff) {
+ /* meta event */
+ event.type = 'meta';
+ var subtypeByte = stream.readInt8();
+ var length = stream.readVarInt();
+ switch(subtypeByte) {
+ case 0x00:
+ event.subtype = 'sequenceNumber';
+ if (length != 2) throw "Expected length for sequenceNumber event is 2, got " + length;
+ event.number = stream.readInt16();
+ return event;
+ case 0x01:
+ event.subtype = 'text';
+ event.text = stream.read(length);
+ return event;
+ case 0x02:
+ event.subtype = 'copyrightNotice';
+ event.text = stream.read(length);
+ return event;
+ case 0x03:
+ event.subtype = 'trackName';
+ event.text = stream.read(length);
+ return event;
+ case 0x04:
+ event.subtype = 'instrumentName';
+ event.text = stream.read(length);
+ return event;
+ case 0x05:
+ event.subtype = 'lyrics';
+ event.text = stream.read(length);
+ return event;
+ case 0x06:
+ event.subtype = 'marker';
+ event.text = stream.read(length);
+ return event;
+ case 0x07:
+ event.subtype = 'cuePoint';
+ event.text = stream.read(length);
+ return event;
+ case 0x20:
+ event.subtype = 'midiChannelPrefix';
+ if (length != 1) throw "Expected length for midiChannelPrefix event is 1, got " + length;
+ event.channel = stream.readInt8();
+ return event;
+ case 0x2f:
+ event.subtype = 'endOfTrack';
+ if (length != 0) throw "Expected length for endOfTrack event is 0, got " + length;
+ return event;
+ case 0x51:
+ event.subtype = 'setTempo';
+ if (length != 3) throw "Expected length for setTempo event is 3, got " + length;
+ event.microsecondsPerBeat = (
+ (stream.readInt8() << 16)
+ + (stream.readInt8() << 8)
+ + stream.readInt8()
+ )
+ return event;
+ case 0x54:
+ event.subtype = 'smpteOffset';
+ if (length != 5) throw "Expected length for smpteOffset event is 5, got " + length;
+ var hourByte = stream.readInt8();
+ event.frameRate = {
+ 0x00: 24, 0x20: 25, 0x40: 29, 0x60: 30
+ }[hourByte & 0x60];
+ event.hour = hourByte & 0x1f;
+ event.min = stream.readInt8();
+ event.sec = stream.readInt8();
+ event.frame = stream.readInt8();
+ event.subframe = stream.readInt8();
+ return event;
+ case 0x58:
+ event.subtype = 'timeSignature';
+ if (length != 4) throw "Expected length for timeSignature event is 4, got " + length;
+ event.numerator = stream.readInt8();
+ event.denominator = Math.pow(2, stream.readInt8());
+ event.metronome = stream.readInt8();
+ event.thirtyseconds = stream.readInt8();
+ return event;
+ case 0x59:
+ event.subtype = 'keySignature';
+ if (length != 2) throw "Expected length for keySignature event is 2, got " + length;
+ event.key = stream.readInt8(true);
+ event.scale = stream.readInt8();
+ return event;
+ case 0x7f:
+ event.subtype = 'sequencerSpecific';
+ event.data = stream.read(length);
+ return event;
+ default:
+ // console.log("Unrecognised meta event subtype: " + subtypeByte);
+ event.subtype = 'unknown'
+ event.data = stream.read(length);
+ return event;
+ }
+ event.data = stream.read(length);
+ return event;
+ } else if (eventTypeByte == 0xf0) {
+ event.type = 'sysEx';
+ var length = stream.readVarInt();
+ event.data = stream.read(length);
+ return event;
+ } else if (eventTypeByte == 0xf7) {
+ event.type = 'dividedSysEx';
+ var length = stream.readVarInt();
+ event.data = stream.read(length);
+ return event;
+ } else {
+ throw "Unrecognised MIDI event type byte: " + eventTypeByte;
+ }
+ } else {
+ /* channel event */
+ var param1;
+ if ((eventTypeByte & 0x80) == 0) {
+ /* running status - reuse lastEventTypeByte as the event type.
+ eventTypeByte is actually the first parameter
+ */
+ param1 = eventTypeByte;
+ eventTypeByte = lastEventTypeByte;
+ } else {
+ param1 = stream.readInt8();
+ lastEventTypeByte = eventTypeByte;
+ }
+ var eventType = eventTypeByte >> 4;
+ event.channel = eventTypeByte & 0x0f;
+ event.type = 'channel';
+ switch (eventType) {
+ case 0x08:
+ event.subtype = 'noteOff';
+ event.noteNumber = param1;
+ event.velocity = stream.readInt8();
+ return event;
+ case 0x09:
+ event.noteNumber = param1;
+ event.velocity = stream.readInt8();
+ if (event.velocity == 0) {
+ event.subtype = 'noteOff';
+ } else {
+ event.subtype = 'noteOn';
+ }
+ return event;
+ case 0x0a:
+ event.subtype = 'noteAftertouch';
+ event.noteNumber = param1;
+ event.amount = stream.readInt8();
+ return event;
+ case 0x0b:
+ event.subtype = 'controller';
+ event.controllerType = param1;
+ event.value = stream.readInt8();
+ return event;
+ case 0x0c:
+ event.subtype = 'programChange';
+ event.programNumber = param1;
+ return event;
+ case 0x0d:
+ event.subtype = 'channelAftertouch';
+ event.amount = param1;
+ return event;
+ case 0x0e:
+ event.subtype = 'pitchBend';
+ event.value = param1 + (stream.readInt8() << 7);
+ return event;
+ default:
+ throw "Unrecognised MIDI event type: " + eventType
+ /*
+ console.log("Unrecognised MIDI event type: " + eventType);
+ stream.readInt8();
+ event.subtype = 'unknown';
+ return event;
+ */
+ }
+ }
+ }
+
+ stream = Stream(data);
+ var headerChunk = readChunk(stream);
+ if (headerChunk.id != 'MThd' || headerChunk.length != 6) {
+ throw "Bad .mid file - header not found";
+ }
+ var headerStream = Stream(headerChunk.data);
+ var formatType = headerStream.readInt16();
+ var trackCount = headerStream.readInt16();
+ var timeDivision = headerStream.readInt16();
+
+ if (timeDivision & 0x8000) {
+ throw "Expressing time division in SMTPE frames is not supported yet"
+ } else {
+ ticksPerBeat = timeDivision;
+ }
+
+ var header = {
+ 'formatType': formatType,
+ 'trackCount': trackCount,
+ 'ticksPerBeat': ticksPerBeat
+ }
+ var tracks = [];
+ for (var i = 0; i < header.trackCount; i++) {
+ tracks[i] = [];
+ var trackChunk = readChunk(stream);
+ if (trackChunk.id != 'MTrk') {
+ throw "Unexpected chunk - expected MTrk, got "+ trackChunk.id;
+ }
+ var trackStream = Stream(trackChunk.data);
+ while (!trackStream.eof()) {
+ var event = readEvent(trackStream);
+ tracks[i].push(event);
+ //console.log(event);
+ }
+ }
+
+ return {
+ 'header': header,
+ 'tracks': tracks
+ }
+} \ No newline at end of file
diff --git a/Processing-js/libs/inc/jasmid/replayer.js b/Processing-js/libs/inc/jasmid/replayer.js
new file mode 100644
index 0000000..347fa1d
--- /dev/null
+++ b/Processing-js/libs/inc/jasmid/replayer.js
@@ -0,0 +1,96 @@
+var clone = function (o) {
+ if (typeof o != 'object') return (o);
+ if (o == null) return (o);
+ var ret = (typeof o.length == 'number') ? [] : {};
+ for (var key in o) ret[key] = clone(o[key]);
+ return ret;
+};
+
+function Replayer(midiFile, timeWarp, eventProcessor) {
+ var trackStates = [];
+ var beatsPerMinute = 120;
+ var ticksPerBeat = midiFile.header.ticksPerBeat;
+
+ for (var i = 0; i < midiFile.tracks.length; i++) {
+ trackStates[i] = {
+ 'nextEventIndex': 0,
+ 'ticksToNextEvent': (
+ midiFile.tracks[i].length ?
+ midiFile.tracks[i][0].deltaTime :
+ null
+ )
+ };
+ }
+
+ var nextEventInfo;
+ var samplesToNextEvent = 0;
+
+ function getNextEvent() {
+ var ticksToNextEvent = null;
+ var nextEventTrack = null;
+ var nextEventIndex = null;
+
+ for (var i = 0; i < trackStates.length; i++) {
+ if (
+ trackStates[i].ticksToNextEvent != null
+ && (ticksToNextEvent == null || trackStates[i].ticksToNextEvent < ticksToNextEvent)
+ ) {
+ ticksToNextEvent = trackStates[i].ticksToNextEvent;
+ nextEventTrack = i;
+ nextEventIndex = trackStates[i].nextEventIndex;
+ }
+ }
+ if (nextEventTrack != null) {
+ /* consume event from that track */
+ var nextEvent = midiFile.tracks[nextEventTrack][nextEventIndex];
+ if (midiFile.tracks[nextEventTrack][nextEventIndex + 1]) {
+ trackStates[nextEventTrack].ticksToNextEvent += midiFile.tracks[nextEventTrack][nextEventIndex + 1].deltaTime;
+ } else {
+ trackStates[nextEventTrack].ticksToNextEvent = null;
+ }
+ trackStates[nextEventTrack].nextEventIndex += 1;
+ /* advance timings on all tracks by ticksToNextEvent */
+ for (var i = 0; i < trackStates.length; i++) {
+ if (trackStates[i].ticksToNextEvent != null) {
+ trackStates[i].ticksToNextEvent -= ticksToNextEvent
+ }
+ }
+ return {
+ "ticksToEvent": ticksToNextEvent,
+ "event": nextEvent,
+ "track": nextEventTrack
+ }
+ } else {
+ return null;
+ }
+ };
+ //
+ var midiEvent;
+ var temporal = [];
+ //
+ function processEvents() {
+ function processNext() {
+ if ( midiEvent.event.type == "meta" && midiEvent.event.subtype == "setTempo" ) {
+ // tempo change events can occur anywhere in the middle and affect events that follow
+ beatsPerMinute = 60000000 / midiEvent.event.microsecondsPerBeat;
+ }
+ if (midiEvent.ticksToEvent > 0) {
+ var beatsToGenerate = midiEvent.ticksToEvent / ticksPerBeat;
+ var secondsToGenerate = beatsToGenerate / (beatsPerMinute / 60);
+ }
+ var time = (secondsToGenerate * 1000 * timeWarp) || 0;
+ temporal.push([ midiEvent, time]);
+ midiEvent = getNextEvent();
+ };
+ //
+ if (midiEvent = getNextEvent()) {
+ while(midiEvent) processNext(true);
+ }
+ };
+ processEvents();
+ return {
+ "getData": function() {
+ return clone(temporal);
+ }
+ };
+};
diff --git a/Processing-js/libs/inc/jasmid/stream.js b/Processing-js/libs/inc/jasmid/stream.js
new file mode 100644
index 0000000..27c69ba
--- /dev/null
+++ b/Processing-js/libs/inc/jasmid/stream.js
@@ -0,0 +1,69 @@
+/* Wrapper for accessing strings through sequential reads */
+function Stream(str) {
+ var position = 0;
+
+ function read(length) {
+ var result = str.substr(position, length);
+ position += length;
+ return result;
+ }
+
+ /* read a big-endian 32-bit integer */
+ function readInt32() {
+ var result = (
+ (str.charCodeAt(position) << 24)
+ + (str.charCodeAt(position + 1) << 16)
+ + (str.charCodeAt(position + 2) << 8)
+ + str.charCodeAt(position + 3));
+ position += 4;
+ return result;
+ }
+
+ /* read a big-endian 16-bit integer */
+ function readInt16() {
+ var result = (
+ (str.charCodeAt(position) << 8)
+ + str.charCodeAt(position + 1));
+ position += 2;
+ return result;
+ }
+
+ /* read an 8-bit integer */
+ function readInt8(signed) {
+ var result = str.charCodeAt(position);
+ if (signed && result > 127) result -= 256;
+ position += 1;
+ return result;
+ }
+
+ function eof() {
+ return position >= str.length;
+ }
+
+ /* read a MIDI-style variable-length integer
+ (big-endian value in groups of 7 bits,
+ with top bit set to signify that another byte follows)
+ */
+ function readVarInt() {
+ var result = 0;
+ while (true) {
+ var b = readInt8();
+ if (b & 0x80) {
+ result += (b & 0x7f);
+ result <<= 7;
+ } else {
+ /* b is the last byte */
+ return result + b;
+ }
+ }
+ }
+
+ return {
+ 'eof': eof,
+ 'read': read,
+ 'readInt32': readInt32,
+ 'readInt16': readInt16,
+ 'readInt8': readInt8,
+ 'readVarInt': readVarInt
+ }
+} \ No newline at end of file
diff --git a/Processing-js/libs/js/MIDI/AudioDetect.js b/Processing-js/libs/js/MIDI/AudioDetect.js
new file mode 100644
index 0000000..a5dd465
--- /dev/null
+++ b/Processing-js/libs/js/MIDI/AudioDetect.js
@@ -0,0 +1,69 @@
+/*
+ -------------------------------------
+ MIDI.audioDetect : 0.3
+ -------------------------------------
+ https://github.com/mudcube/MIDI.js
+ -------------------------------------
+ Probably, Maybe, No... Absolutely!
+ -------------------------------------
+ Test to see what types of <audio> MIME types are playable by the browser.
+ -------------------------------------
+*/
+
+if (typeof(MIDI) === "undefined") var MIDI = {};
+
+(function() { "use strict";
+
+var supports = {};
+var pending = 0;
+var canPlayThrough = function (src) {
+ pending ++;
+ var audio = new Audio();
+ var mime = src.split(";")[0];
+ audio.id = "audio";
+ audio.setAttribute("preload", "auto");
+ audio.setAttribute("audiobuffer", true);
+ audio.addEventListener("error", function() {
+ supports[mime] = false;
+ pending --;
+ }, false);
+ audio.addEventListener("canplaythrough", function() {
+ supports[mime] = true;
+ pending --;
+ }, false);
+ audio.src = "data:" + src;
+ document.body.appendChild(audio);
+};
+
+MIDI.audioDetect = function(callback) {
+ // check whether <audio> tag is supported
+ if (typeof(Audio) === "undefined") return callback({});
+ // check whether canPlayType is supported
+ var audio = new Audio();
+ if (typeof(audio.canPlayType) === "undefined") return callback(supports);
+ // see what we can learn from the browser
+ var vorbis = audio.canPlayType('audio/ogg; codecs="vorbis"');
+ vorbis = (vorbis === "probably" || vorbis === "maybe");
+ var mpeg = audio.canPlayType('audio/mpeg');
+ mpeg = (mpeg === "probably" || mpeg === "maybe");
+ // maybe nothing is supported
+ if (!vorbis && !mpeg) {
+ callback(supports);
+ return;
+ }
+ // or maybe something is supported
+ if (vorbis) canPlayThrough("audio/ogg;base64,T2dnUwACAAAAAAAAAADqnjMlAAAAAOyyzPIBHgF2b3JiaXMAAAAAAUAfAABAHwAAQB8AAEAfAACZAU9nZ1MAAAAAAAAAAAAA6p4zJQEAAAANJGeqCj3//////////5ADdm9yYmlzLQAAAFhpcGguT3JnIGxpYlZvcmJpcyBJIDIwMTAxMTAxIChTY2hhdWZlbnVnZ2V0KQAAAAABBXZvcmJpcw9CQ1YBAAABAAxSFCElGVNKYwiVUlIpBR1jUFtHHWPUOUYhZBBTiEkZpXtPKpVYSsgRUlgpRR1TTFNJlVKWKUUdYxRTSCFT1jFloXMUS4ZJCSVsTa50FkvomWOWMUYdY85aSp1j1jFFHWNSUkmhcxg6ZiVkFDpGxehifDA6laJCKL7H3lLpLYWKW4q91xpT6y2EGEtpwQhhc+211dxKasUYY4wxxsXiUyiC0JBVAAABAABABAFCQ1YBAAoAAMJQDEVRgNCQVQBABgCAABRFcRTHcRxHkiTLAkJDVgEAQAAAAgAAKI7hKJIjSZJkWZZlWZameZaouaov+64u667t6roOhIasBACAAAAYRqF1TCqDEEPKQ4QUY9AzoxBDDEzGHGNONKQMMogzxZAyiFssLqgQBKEhKwKAKAAAwBjEGGIMOeekZFIi55iUTkoDnaPUUcoolRRLjBmlEluJMYLOUeooZZRCjKXFjFKJscRUAABAgAMAQICFUGjIigAgCgCAMAYphZRCjCnmFHOIMeUcgwwxxiBkzinoGJNOSuWck85JiRhjzjEHlXNOSuekctBJyaQTAAAQ4AAAEGAhFBqyIgCIEwAwSJKmWZomipamiaJniqrqiaKqWp5nmp5pqqpnmqpqqqrrmqrqypbnmaZnmqrqmaaqiqbquqaquq6nqrZsuqoum65q267s+rZru77uqapsm6or66bqyrrqyrbuurbtS56nqqKquq5nqq6ruq5uq65r25pqyq6purJtuq4tu7Js664s67pmqq5suqotm64s667s2rYqy7ovuq5uq7Ks+6os+75s67ru2rrwi65r66os674qy74x27bwy7ouHJMnqqqnqq7rmarrqq5r26rr2rqmmq5suq4tm6or26os67Yry7aumaosm64r26bryrIqy77vyrJui67r66Ys67oqy8Lu6roxzLat+6Lr6roqy7qvyrKuu7ru+7JuC7umqrpuyrKvm7Ks+7auC8us27oxuq7vq7It/KosC7+u+8Iy6z5jdF1fV21ZGFbZ9n3d95Vj1nVhWW1b+V1bZ7y+bgy7bvzKrQvLstq2scy6rSyvrxvDLux8W/iVmqratum6um7Ksq/Lui60dd1XRtf1fdW2fV+VZd+3hV9pG8OwjK6r+6os68Jry8ov67qw7MIvLKttK7+r68ow27qw3L6wLL/uC8uq277v6rrStXVluX2fsSu38QsAABhwAAAIMKEMFBqyIgCIEwBAEHIOKQahYgpCCKGkEEIqFWNSMuakZM5JKaWUFEpJrWJMSuaclMwxKaGUlkopqYRSWiqlxBRKaS2l1mJKqcVQSmulpNZKSa2llGJMrcUYMSYlc05K5pyUklJrJZXWMucoZQ5K6iCklEoqraTUYuacpA46Kx2E1EoqMZWUYgupxFZKaq2kFGMrMdXUWo4hpRhLSrGVlFptMdXWWqs1YkxK5pyUzDkqJaXWSiqtZc5J6iC01DkoqaTUYiopxco5SR2ElDLIqJSUWiupxBJSia20FGMpqcXUYq4pxRZDSS2WlFosqcTWYoy1tVRTJ6XFklKMJZUYW6y5ttZqDKXEVkqLsaSUW2sx1xZjjqGkFksrsZWUWmy15dhayzW1VGNKrdYWY40x5ZRrrT2n1mJNMdXaWqy51ZZbzLXnTkprpZQWS0oxttZijTHmHEppraQUWykpxtZara3FXEMpsZXSWiypxNhirLXFVmNqrcYWW62ltVprrb3GVlsurdXcYqw9tZRrrLXmWFNtBQAADDgAAASYUAYKDVkJAEQBAADGMMYYhEYpx5yT0ijlnHNSKucghJBS5hyEEFLKnINQSkuZcxBKSSmUklJqrYVSUmqttQIAAAocAAACbNCUWByg0JCVAEAqAIDBcTRNFFXVdX1fsSxRVFXXlW3jVyxNFFVVdm1b+DVRVFXXtW3bFn5NFFVVdmXZtoWiqrqybduybgvDqKqua9uybeuorqvbuq3bui9UXVmWbVu3dR3XtnXd9nVd+Bmzbeu2buu+8CMMR9/4IeTj+3RCCAAAT3AAACqwYXWEk6KxwEJDVgIAGQAAgDFKGYUYM0gxphhjTDHGmAAAgAEHAIAAE8pAoSErAoAoAADAOeecc84555xzzjnnnHPOOeecc44xxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY0wAwE6EA8BOhIVQaMhKACAcAABACCEpKaWUUkoRU85BSSmllFKqFIOMSkoppZRSpBR1lFJKKaWUIqWgpJJSSimllElJKaWUUkoppYw6SimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaVUSimllFJKKaWUUkoppRQAYPLgAACVYOMMK0lnhaPBhYasBAByAwAAhRiDEEJpraRUUkolVc5BKCWUlEpKKZWUUqqYgxBKKqmlklJKKbXSQSihlFBKKSWUUkooJYQQSgmhlFRCK6mEUkoHoYQSQimhhFRKKSWUzkEoIYUOQkmllNRCSB10VFIpIZVSSiklpZQ6CKGUklJLLZVSWkqpdBJSKamV1FJqqbWSUgmhpFZKSSWl0lpJJbUSSkklpZRSSymFVFJJJYSSUioltZZaSqm11lJIqZWUUkqppdRSSiWlkEpKqZSSUmollZRSaiGVlEpJKaTUSimlpFRCSamlUlpKLbWUSkmptFRSSaWUlEpJKaVSSksppRJKSqmllFpJKYWSUkoplZJSSyW1VEoKJaWUUkmptJRSSymVklIBAEAHDgAAAUZUWoidZlx5BI4oZJiAAgAAQABAgAkgMEBQMApBgDACAQAAAADAAAAfAABHARAR0ZzBAUKCwgJDg8MDAAAAAAAAAAAAAACAT2dnUwAEAAAAAAAAAADqnjMlAgAAADzQPmcBAQA=");
+ if (mpeg) canPlayThrough("audio/mpeg;base64,/+MYxAAAAANIAUAAAASEEB/jwOFM/0MM/90b/+RhST//w4NFwOjf///PZu////9lns5GFDv//l9GlUIEEIAAAgIg8Ir/JGq3/+MYxDsLIj5QMYcoAP0dv9HIjUcH//yYSg+CIbkGP//8w0bLVjUP///3Z0x5QCAv/yLjwtGKTEFNRTMuOTeqqqqqqqqqqqqq/+MYxEkNmdJkUYc4AKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq");
+ // lets find out!
+ var time = (new Date()).getTime();
+ var interval = window.setInterval(function() {
+ var now = (new Date()).getTime();
+ var maxExecution = now - time > 5000;
+ if (!pending || maxExecution) {
+ window.clearInterval(interval);
+ callback(supports);
+ }
+ }, 1);
+};
+
+})(); \ No newline at end of file
diff --git a/Processing-js/libs/js/MIDI/LoadPlugin.js b/Processing-js/libs/js/MIDI/LoadPlugin.js
new file mode 100644
index 0000000..dad5cbd
--- /dev/null
+++ b/Processing-js/libs/js/MIDI/LoadPlugin.js
@@ -0,0 +1,179 @@
+/*
+ -----------------------------------------------------------
+ MIDI.loadPlugin : 0.1.2 : 01/22/2014
+ -----------------------------------------------------------
+ https://github.com/mudcube/MIDI.js
+ -----------------------------------------------------------
+ MIDI.loadPlugin({
+ targetFormat: "mp3", // optionally can force to use MP3 (for instance on mobile networks)
+ instrument: "acoustic_grand_piano", // or 1 (default)
+ instruments: [ "acoustic_grand_piano", "acoustic_guitar_nylon" ], // or multiple instruments
+ callback: function() { }
+ });
+*/
+
+if (typeof (MIDI) === "undefined") var MIDI = {};
+if (typeof (MIDI.Soundfont) === "undefined") MIDI.Soundfont = {};
+
+(function() { "use strict";
+
+var USE_JAZZMIDI = false; // Turn on to support JazzMIDI Plugin
+
+MIDI.loadPlugin = function(conf) {
+ if (typeof(conf) === "function") conf = {
+ callback: conf
+ };
+ /// Get the instrument name.
+ var instruments = conf.instruments || conf.instrument || "acoustic_grand_piano";
+ if (typeof(instruments) !== "object") instruments = [ instruments ];
+ ///
+ for (var n = 0; n < instruments.length; n ++) {
+ var instrument = instruments[n];
+ if (typeof(instrument) === "number") {
+ instruments[n] = MIDI.GeneralMIDI.byId[instrument];
+ }
+ };
+ ///
+ MIDI.soundfontUrl = conf.soundfontUrl || MIDI.soundfontUrl || "./soundfont/";
+ /// Detect the best type of audio to use.
+ MIDI.audioDetect(function(types) {
+ var api = "";
+ // use the most appropriate plugin if not specified
+ if (apis[conf.api]) {
+ api = conf.api;
+ } else if (apis[window.location.hash.substr(1)]) {
+ api = window.location.hash.substr(1);
+ } else if (USE_JAZZMIDI && navigator.requestMIDIAccess) {
+ api = "webmidi";
+ } else if (window.webkitAudioContext || window.AudioContext) { // Chrome
+ api = "webaudio";
+ } else if (window.Audio) { // Firefox
+ api = "audiotag";
+ } else { // Internet Explorer
+ api = "flash";
+ }
+ ///
+ if (!connect[api]) return;
+ // use audio/ogg when supported
+ if (conf.targetFormat) {
+ var filetype = conf.targetFormat;
+ } else { // use best quality
+ var filetype = types["audio/ogg"] ? "ogg" : "mp3";
+ }
+ // load the specified plugin
+ MIDI.lang = api;
+ MIDI.supports = types;
+ connect[api](filetype, instruments, conf);
+ });
+};
+
+///
+
+var connect = {};
+
+connect.webmidi = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("Web MIDI API...");
+ MIDI.WebMIDI.connect(conf);
+};
+
+connect.flash = function(filetype, instruments, conf) {
+ // fairly quick, but requires loading of individual MP3s (more http requests).
+ if (MIDI.loader) MIDI.loader.message("Flash API...");
+ DOMLoader.script.add({
+ src: conf.soundManagerUrl || "./inc/SoundManager2/script/soundmanager2.js",
+ verify: "SoundManager",
+ callback: function () {
+ MIDI.Flash.connect(instruments, conf);
+ }
+ });
+};
+
+connect.audiotag = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("HTML5 Audio API...");
+ // works ok, kinda like a drunken tuna fish, across the board.
+ var queue = createQueue({
+ items: instruments,
+ getNext: function(instrumentId) {
+ DOMLoader.sendRequest({
+ url: MIDI.soundfontUrl + instrumentId + "-" + filetype + ".js",
+ onprogress: getPercent,
+ onload: function (response) {
+ addSoundfont(response.responseText);
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading", 100);
+ queue.getNext();
+ }
+ });
+ },
+ onComplete: function() {
+ MIDI.AudioTag.connect(conf);
+ }
+ });
+};
+
+connect.webaudio = function(filetype, instruments, conf) {
+ if (MIDI.loader) MIDI.loader.message("Web Audio API...");
+ // works awesome! safari, chrome and firefox support.
+ var queue = createQueue({
+ items: instruments,
+ getNext: function(instrumentId) {
+ DOMLoader.sendRequest({
+ url: MIDI.soundfontUrl + instrumentId + "-" + filetype + ".js",
+ onprogress: getPercent,
+ onload: function(response) {
+ addSoundfont(response.responseText);
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading...", 100);
+ queue.getNext();
+ }
+ });
+ },
+ onComplete: function() {
+ MIDI.WebAudio.connect(conf);
+ }
+ });
+};
+
+/// Helpers
+
+var apis = {
+ "webmidi": true,
+ "webaudio": true,
+ "audiotag": true,
+ "flash": true
+};
+
+var addSoundfont = function(text) {
+ var script = document.createElement("script");
+ script.language = "javascript";
+ script.type = "text/javascript";
+ script.text = text;
+ document.body.appendChild(script);
+};
+
+var getPercent = function(event) {
+ if (!this.totalSize) {
+ if (this.getResponseHeader("Content-Length-Raw")) {
+ this.totalSize = parseInt(this.getResponseHeader("Content-Length-Raw"));
+ } else {
+ this.totalSize = event.total;
+ }
+ }
+ ///
+ var percent = this.totalSize ? Math.round(event.loaded / this.totalSize * 100) : "";
+ if (MIDI.loader) MIDI.loader.update(null, "Downloading...", percent);
+};
+
+var createQueue = function(conf) {
+ var self = {};
+ self.queue = [];
+ for (var key in conf.items) {
+ self.queue.push(conf.items[key]);
+ }
+ self.getNext = function() {
+ if (!self.queue.length) return conf.onComplete();
+ conf.getNext(self.queue.shift());
+ };
+ setTimeout(self.getNext, 1);
+ return self;
+};
+
+})(); \ No newline at end of file
diff --git a/Processing-js/libs/js/MIDI/Player.js b/Processing-js/libs/js/MIDI/Player.js
new file mode 100644
index 0000000..bfa4e3b
--- /dev/null
+++ b/Processing-js/libs/js/MIDI/Player.js
@@ -0,0 +1,277 @@
+/*
+ -------------------------------------
+ MIDI.Player : 0.3
+ -------------------------------------
+ https://github.com/mudcube/MIDI.js
+ -------------------------------------
+ #jasmid
+ -------------------------------------
+*/
+
+if (typeof (MIDI) === "undefined") var MIDI = {};
+if (typeof (MIDI.Player) === "undefined") MIDI.Player = {};
+
+(function() { "use strict";
+
+var root = MIDI.Player;
+root.callback = undefined; // your custom callback goes here!
+root.currentTime = 0;
+root.endTime = 0;
+root.restart = 0;
+root.playing = false;
+root.timeWarp = 1;
+
+//
+root.start =
+root.resume = function () {
+ if (root.currentTime < -1) root.currentTime = -1;
+ startAudio(root.currentTime);
+};
+
+root.pause = function () {
+ var tmp = root.restart;
+ stopAudio();
+ root.restart = tmp;
+};
+
+root.stop = function () {
+ stopAudio();
+ root.restart = 0;
+ root.currentTime = 0;
+};
+
+root.addListener = function(callback) {
+ onMidiEvent = callback;
+};
+
+root.removeListener = function() {
+ onMidiEvent = undefined;
+};
+
+root.clearAnimation = function() {
+ if (root.interval) {
+ window.clearInterval(root.interval);
+ }
+};
+
+root.setAnimation = function(config) {
+ var callback = (typeof(config) === "function") ? config : config.callback;
+ var interval = config.interval || 30;
+ var currentTime = 0;
+ var tOurTime = 0;
+ var tTheirTime = 0;
+ //
+ root.clearAnimation();
+ root.interval = window.setInterval(function () {
+ if (root.endTime === 0) return;
+ if (root.playing) {
+ currentTime = (tTheirTime === root.currentTime) ? tOurTime - (new Date).getTime() : 0;
+ if (root.currentTime === 0) {
+ currentTime = 0;
+ } else {
+ currentTime = root.currentTime - currentTime;
+ }
+ if (tTheirTime !== root.currentTime) {
+ tOurTime = (new Date).getTime();
+ tTheirTime = root.currentTime;
+ }
+ } else { // paused
+ currentTime = root.currentTime;
+ }
+ var endTime = root.endTime;
+ var percent = currentTime / endTime;
+ var total = currentTime / 1000;
+ var minutes = total / 60;
+ var seconds = total - (minutes * 60);
+ var t1 = minutes * 60 + seconds;
+ var t2 = (endTime / 1000);
+ if (t2 - t1 < -1) return;
+ callback({
+ now: t1,
+ end: t2,
+ events: noteRegistrar
+ });
+ }, interval);
+};
+
+// helpers
+
+root.loadMidiFile = function() { // reads midi into javascript array of events
+ root.replayer = new Replayer(MidiFile(root.currentData), root.timeWarp);
+ root.data = root.replayer.getData();
+ root.endTime = getLength();
+};
+
+root.loadFile = function (file, callback) {
+ root.stop();
+ if (file.indexOf("base64,") !== -1) {
+ var data = window.atob(file.split(",")[1]);
+ root.currentData = data;
+ root.loadMidiFile();
+ if (callback) callback(data);
+ return;
+ }
+ ///
+ var fetch = new XMLHttpRequest();
+ fetch.open('GET', file);
+ fetch.overrideMimeType("text/plain; charset=x-user-defined");
+ fetch.onreadystatechange = function () {
+ if (this.readyState === 4 && this.status === 200) {
+ var t = this.responseText || "";
+ var ff = [];
+ var mx = t.length;
+ var scc = String.fromCharCode;
+ for (var z = 0; z < mx; z++) {
+ ff[z] = scc(t.charCodeAt(z) & 255);
+ }
+ var data = ff.join("");
+ root.currentData = data;
+ root.loadMidiFile();
+ if (callback) callback(data);
+ }
+ };
+ fetch.send();
+};
+
+// Playing the audio
+
+var eventQueue = []; // hold events to be triggered
+var queuedTime; //
+var startTime = 0; // to measure time elapse
+var noteRegistrar = {}; // get event for requested note
+var onMidiEvent = undefined; // listener callback
+var scheduleTracking = function (channel, note, currentTime, offset, message, velocity) {
+ var interval = window.setTimeout(function () {
+ var data = {
+ channel: channel,
+ note: note,
+ now: currentTime,
+ end: root.endTime,
+ message: message,
+ velocity: velocity
+ };
+ //
+ if (message === 128) {
+ delete noteRegistrar[note];
+ } else {
+ noteRegistrar[note] = data;
+ }
+ if (onMidiEvent) {
+ onMidiEvent(data);
+ }
+ root.currentTime = currentTime;
+ if (root.currentTime === queuedTime && queuedTime < root.endTime) { // grab next sequence
+ startAudio(queuedTime, true);
+ }
+ }, currentTime - offset);
+ return interval;
+};
+
+var getContext = function() {
+ if (MIDI.lang === 'WebAudioAPI') {
+ return MIDI.Player.ctx;
+ } else if (!root.ctx) {
+ root.ctx = { currentTime: 0 };
+ }
+ return root.ctx;
+};
+
+var getLength = function() {
+ var data = root.data;
+ var length = data.length;
+ var totalTime = 0.5;
+ for (var n = 0; n < length; n++) {
+ totalTime += data[n][1];
+ }
+ return totalTime;
+};
+
+var startAudio = function (currentTime, fromCache) {
+ if (!root.replayer) return;
+ if (!fromCache) {
+ if (typeof (currentTime) === "undefined") currentTime = root.restart;
+ if (root.playing) stopAudio();
+ root.playing = true;
+ root.data = root.replayer.getData();
+ root.endTime = getLength();
+ }
+ var note;
+ var offset = 0;
+ var messages = 0;
+ var data = root.data;
+ var ctx = getContext();
+ var length = data.length;
+ //
+ queuedTime = 0.5;
+ startTime = ctx.currentTime;
+ //
+ for (var n = 0; n < length && messages < 100; n++) {
+ queuedTime += data[n][1];
+ if (queuedTime < currentTime) {
+ offset = queuedTime;
+ continue;
+ }
+ currentTime = queuedTime - offset;
+ var event = data[n][0].event;
+ if (event.type !== "channel") continue;
+ var channel = event.channel;
+ switch (event.subtype) {
+ case 'noteOn':
+ if (MIDI.channels[channel].mute) break;
+ note = event.noteNumber - (root.MIDIOffset || 0);
+ eventQueue.push({
+ event: event,
+ source: MIDI.noteOn(channel, event.noteNumber, event.velocity, currentTime / 1000 + ctx.currentTime),
+ interval: scheduleTracking(channel, note, queuedTime, offset, 144, event.velocity)
+ });
+ messages ++;
+ break;
+ case 'noteOff':
+ if (MIDI.channels[channel].mute) break;
+ note = event.noteNumber - (root.MIDIOffset || 0);
+ eventQueue.push({
+ event: event,
+ source: MIDI.noteOff(channel, event.noteNumber, currentTime / 1000 + ctx.currentTime),
+ interval: scheduleTracking(channel, note, queuedTime, offset, 128)
+ });
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+var stopAudio = function () {
+ var ctx = getContext();
+ root.playing = false;
+ root.restart += (ctx.currentTime - startTime) * 1000;
+ // stop the audio, and intervals
+ while (eventQueue.length) {
+ var o = eventQueue.pop();
+ window.clearInterval(o.interval);
+ if (!o.source) continue; // is not webaudio
+ if (typeof(o.source) === "number") {
+ window.clearTimeout(o.source);
+ } else { // webaudio
+ o.source.disconnect(0);
+ }
+ }
+ // run callback to cancel any notes still playing
+ for (var key in noteRegistrar) {
+ var o = noteRegistrar[key]
+ if (noteRegistrar[key].message === 144 && onMidiEvent) {
+ onMidiEvent({
+ channel: o.channel,
+ note: o.note,
+ now: o.now,
+ end: o.end,
+ message: 128,
+ velocity: o.velocity
+ });
+ }
+ }
+ // reset noteRegistrar
+ noteRegistrar = {};
+};
+
+})(); \ No newline at end of file
diff --git a/Processing-js/libs/js/MIDI/Plugin.js b/Processing-js/libs/js/MIDI/Plugin.js
new file mode 100644
index 0000000..7647f96
--- /dev/null
+++ b/Processing-js/libs/js/MIDI/Plugin.js
@@ -0,0 +1,623 @@
+/*
+ --------------------------------------------
+ MIDI.Plugin : 0.3.2 : 2013/01/26
+ --------------------------------------------
+ https://github.com/mudcube/MIDI.js
+ --------------------------------------------
+ Inspired by javax.sound.midi (albeit a super simple version):
+ http://docs.oracle.com/javase/6/docs/api/javax/sound/midi/package-summary.html
+ --------------------------------------------
+ Technologies:
+ MIDI.WebMIDI
+ MIDI.WebAudio
+ MIDI.Flash
+ MIDI.AudioTag
+ --------------------------------------------
+ Helpers:
+ MIDI.GeneralMIDI
+ MIDI.channels
+ MIDI.keyToNote
+ MIDI.noteToKey
+*/
+
+if (typeof (MIDI) === "undefined") var MIDI = {};
+
+(function() { "use strict";
+
+var setPlugin = function(root) {
+ MIDI.api = root.api;
+ MIDI.setVolume = root.setVolume;
+ MIDI.programChange = root.programChange;
+ MIDI.noteOn = root.noteOn;
+ MIDI.noteOff = root.noteOff;
+ MIDI.chordOn = root.chordOn;
+ MIDI.chordOff = root.chordOff;
+ MIDI.stopAllNotes = root.stopAllNotes;
+ MIDI.getInput = root.getInput;
+ MIDI.getOutputs = root.getOutputs;
+};
+
+/*
+ --------------------------------------------
+ Web MIDI API - Native Soundbank
+ --------------------------------------------
+ https://dvcs.w3.org/hg/audio/raw-file/tip/midi/specification.html
+ --------------------------------------------
+*/
+
+(function () {
+ var plugin = null;
+ var output = null;
+ var channels = [];
+ var root = MIDI.WebMIDI = {
+ api: "webmidi"
+ };
+ root.setVolume = function (channel, volume) { // set channel volume
+ output.send([0xB0 + channel, 0x07, volume]);
+ };
+
+ root.programChange = function (channel, program) { // change channel instrument
+ output.send([0xC0 + channel, program]);
+ };
+
+ root.noteOn = function (channel, note, velocity, delay) {
+ output.send([0x90 + channel, note, velocity], delay * 1000);
+ };
+
+ root.noteOff = function (channel, note, delay) {
+ output.send([0x80 + channel, note, 0], delay * 1000);
+ };
+
+ root.chordOn = function (channel, chord, velocity, delay) {
+ for (var n = 0; n < chord.length; n ++) {
+ var note = chord[n];
+ output.send([0x90 + channel, note, velocity], delay * 1000);
+ }
+ };
+
+ root.chordOff = function (channel, chord, delay) {
+ for (var n = 0; n < chord.length; n ++) {
+ var note = chord[n];
+ output.send([0x80 + channel, note, 0], delay * 1000);
+ }
+ };
+
+ root.stopAllNotes = function () {
+ for (var channel = 0; channel < 16; channel ++) {
+ output.send([0xB0 + channel, 0x7B, 0]);
+ }
+ };
+
+ root.getInput = function () {
+ return plugin.getInputs();
+ };
+
+ root.getOutputs = function () {
+ return plugin.getOutputs();
+ };
+
+ root.connect = function (conf) {
+ setPlugin(root);
+ navigator.requestMIDIAccess().then(function (access) {
+ plugin = access;
+ output = plugin.outputs()[0];
+ if (conf.callback) conf.callback();
+ }, function (err) { // well at least we tried!
+ if (window.AudioContext || window.webkitAudioContext) { // Chrome
+ conf.api = "webaudio";
+ } else if (window.Audio) { // Firefox
+ conf.api = "audiotag";
+ } else { // Internet Explorer
+ conf.api = "flash";
+ }
+ MIDI.loadPlugin(conf);
+ });
+ };
+})();
+
+/*
+ --------------------------------------------
+ Web Audio API - OGG or MPEG Soundbank
+ --------------------------------------------
+ https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html
+ --------------------------------------------
+*/
+
+if (window.AudioContext || window.webkitAudioContext) (function () {
+
+ var AudioContext = window.AudioContext || window.webkitAudioContext;
+ var root = MIDI.WebAudio = {
+ api: "webaudio"
+ };
+ var ctx;
+ var sources = {};
+ var masterVolume = 127;
+ var audioBuffers = {};
+ var audioLoader = function (instrument, urlList, index, bufferList, callback) {
+ var synth = MIDI.GeneralMIDI.byName[instrument];
+ var instrumentId = synth.number;
+ var url = urlList[index];
+ if (!MIDI.Soundfont[instrument][url]) { // missing soundfont
+ return callback(instrument);
+ }
+ var base64 = MIDI.Soundfont[instrument][url].split(",")[1];
+ var buffer = Base64Binary.decodeArrayBuffer(base64);
+ ctx.decodeAudioData(buffer, function (buffer) {
+ var msg = url;
+ while (msg.length < 3) msg += "&nbsp;";
+ if (typeof (MIDI.loader) !== "undefined") {
+ MIDI.loader.update(null, synth.instrument + "<br>Processing: " + (index / 87 * 100 >> 0) + "%<br>" + msg);
+ }
+ buffer.id = url;
+ bufferList[index] = buffer;
+ //
+ if (bufferList.length === urlList.length) {
+ while (bufferList.length) {
+ buffer = bufferList.pop();
+ if (!buffer) continue;
+ var nodeId = MIDI.keyToNote[buffer.id];
+ audioBuffers[instrumentId + "" + nodeId] = buffer;
+ }
+ callback(instrument);
+ }
+ });
+ };
+
+ root.setVolume = function (channel, volume) {
+ masterVolume = volume;
+ };
+
+ root.programChange = function (channel, program) {
+ MIDI.channels[channel].instrument = program;
+ };
+
+ root.noteOn = function (channel, note, velocity, delay) {
+ /// check whether the note exists
+ if (!MIDI.channels[channel]) return;
+ var instrument = MIDI.channels[channel].instrument;
+ if (!audioBuffers[instrument + "" + note]) return;
+ /// convert relative delay to absolute delay
+ if (delay < ctx.currentTime) delay += ctx.currentTime;
+ /// crate audio buffer
+ var source = ctx.createBufferSource();
+ sources[channel + "" + note] = source;
+ source.buffer = audioBuffers[instrument + "" + note];
+ source.connect(ctx.destination);
+ ///
+ if (ctx.createGain) { // firefox
+ source.gainNode = ctx.createGain();
+ } else { // chrome
+ source.gainNode = ctx.createGainNode();
+ }
+ var value = (velocity / 127) * (masterVolume / 127) * 2 - 1;
+ source.gainNode.connect(ctx.destination);
+ source.gainNode.gain.value = Math.max(-1, value);
+ source.connect(source.gainNode);
+ if (source.noteOn) { // old api
+ source.noteOn(delay || 0);
+ } else { // new api
+ source.start(delay || 0);
+ }
+ return source;
+ };
+
+ root.noteOff = function (channel, note, delay) {
+ delay = delay || 0;
+ if (delay < ctx.currentTime) delay += ctx.currentTime;
+ var source = sources[channel + "" + note];
+ if (!source) return;
+ if (source.gainNode) {
+ // @Miranet: "the values of 0.2 and 0.3 could ofcourse be used as
+ // a 'release' parameter for ADSR like time settings."
+ // add { "metadata": { release: 0.3 } } to soundfont files
+ var gain = source.gainNode.gain;
+ gain.linearRampToValueAtTime(gain.value, delay);
+ gain.linearRampToValueAtTime(-1, delay + 0.2);
+ }
+ if (source.noteOff) { // old api
+ source.noteOff(delay + 0.3);
+ } else {
+ source.stop(delay + 0.3);
+ }
+ ///
+ delete sources[channel + "" + note];
+ };
+
+ root.chordOn = function (channel, chord, velocity, delay) {
+ var ret = {}, note;
+ for (var n = 0, length = chord.length; n < length; n++) {
+ ret[note = chord[n]] = root.noteOn(channel, note, velocity, delay);
+ }
+ return ret;
+ };
+
+ root.chordOff = function (channel, chord, delay) {
+ var ret = {}, note;
+ for (var n = 0, length = chord.length; n < length; n++) {
+ ret[note = chord[n]] = root.noteOff(channel, note, delay);
+ }
+ return ret;
+ };
+
+ root.stopAllNotes = function () {
+ for (var source in sources) {
+ var delay = 0;
+ if (delay < ctx.currentTime) delay += ctx.currentTime;
+ // @Miranet: "the values of 0.2 and 0.3 could ofcourse be used as
+ // a 'release' parameter for ADSR like time settings."
+ // add { "metadata": { release: 0.3 } } to soundfont files
+ sources[source].gain.linearRampToValueAtTime(1, delay);
+ sources[source].gain.linearRampToValueAtTime(0, delay + 0.2);
+ sources[source].noteOff(delay + 0.3);
+ delete sources[source];
+ }
+ };
+
+ root.connect = function (conf) {
+ setPlugin(root);
+ //
+ MIDI.Player.ctx = ctx = new AudioContext();
+ ///
+ var urlList = [];
+ var keyToNote = MIDI.keyToNote;
+ for (var key in keyToNote) urlList.push(key);
+ var bufferList = [];
+ var pending = {};
+ var oncomplete = function(instrument) {
+ delete pending[instrument];
+ for (var key in pending) break;
+ if (!key) conf.callback();
+ };
+ for (var instrument in MIDI.Soundfont) {
+ pending[instrument] = true;
+ for (var i = 0; i < urlList.length; i++) {
+ audioLoader(instrument, urlList, i, bufferList, oncomplete);
+ }
+ }
+ };
+})();
+
+/*
+ --------------------------------------------
+ AudioTag <audio> - OGG or MPEG Soundbank
+ --------------------------------------------
+ http://dev.w3.org/html5/spec/Overview.html#the-audio-element
+ --------------------------------------------
+*/
+
+if (window.Audio) (function () {
+
+ var root = MIDI.AudioTag = {
+ api: "audiotag"
+ };
+ var note2id = {};
+ var volume = 127; // floating point
+ var channel_nid = -1; // current channel
+ var channels = []; // the audio channels
+ var channelInstrumentNoteIds = []; // instrumentId + noteId that is currently playing in each 'channel', for routing noteOff/chordOff calls
+ var notes = {}; // the piano keys
+ for (var nid = 0; nid < 12; nid++) {
+ channels[nid] = new Audio();
+ }
+
+ var playChannel = function (channel, note) {
+ if (!MIDI.channels[channel]) return;
+ var instrument = MIDI.channels[channel].instrument;
+ var instrumentId = MIDI.GeneralMIDI.byId[instrument].id;
+ var note = notes[note];
+ if (!note) return;
+ var instrumentNoteId = instrumentId + "" + note.id;
+ var nid = (channel_nid + 1) % channels.length;
+ var audio = channels[nid];
+ channelInstrumentNoteIds[ nid ] = instrumentNoteId;
+ audio.src = MIDI.Soundfont[instrumentId][note.id];
+ audio.volume = volume / 127;
+ audio.play();
+ channel_nid = nid;
+ };
+
+ var stopChannel = function (channel, note) {
+ if (!MIDI.channels[channel]) return;
+ var instrument = MIDI.channels[channel].instrument;
+ var instrumentId = MIDI.GeneralMIDI.byId[instrument].id;
+ var note = notes[note];
+ if (!note) return;
+ var instrumentNoteId = instrumentId + "" + note.id;
+
+ for(var i=0;i<channels.length;i++){
+ var nid = (i + channel_nid + 1) % channels.length;
+ var cId = channelInstrumentNoteIds[nid];
+
+ if(cId && cId == instrumentNoteId){
+ channels[nid].pause();
+ channelInstrumentNoteIds[nid] = null;
+ return;
+ }
+ }
+ };
+
+ root.programChange = function (channel, program) {
+ MIDI.channels[channel].instrument = program;
+ };
+
+ root.setVolume = function (channel, n) {
+ volume = n; //- should be channel specific volume
+ };
+
+ root.noteOn = function (channel, note, velocity, delay) {
+ var id = note2id[note];
+ if (!notes[id]) return;
+ if (delay) {
+ return window.setTimeout(function () {
+ playChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ playChannel(channel, id);
+ }
+ };
+
+ root.noteOff = function (channel, note, delay) {
+ var id = note2id[note];
+ if (!notes[id]) return;
+ if (delay) {
+ return setTimeout(function() {
+ stopChannel(channel, id);
+ }, delay * 1000)
+ } else {
+ stopChannel(channel, id);
+ }
+ };
+
+ root.chordOn = function (channel, chord, velocity, delay) {
+ for (var idx = 0; idx < chord.length; idx ++) {
+ var n = chord[idx];
+ var id = note2id[n];
+ if (!notes[id]) continue;
+ if (delay) {
+ return window.setTimeout(function () {
+ playChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ playChannel(channel, id);
+ }
+ }
+ };
+
+ root.chordOff = function (channel, chord, delay) {
+ for (var idx = 0; idx < chord.length; idx ++) {
+ var n = chord[idx];
+ var id = note2id[n];
+ if (!notes[id]) continue;
+ if (delay) {
+ return window.setTimeout(function () {
+ stopChannel(channel, id);
+ }, delay * 1000);
+ } else {
+ stopChannel(channel, id);
+ }
+ }
+ };
+
+ root.stopAllNotes = function () {
+ for (var nid = 0, length = channels.length; nid < length; nid++) {
+ channels[nid].pause();
+ }
+ };
+
+ root.connect = function (conf) {
+ for (var key in MIDI.keyToNote) {
+ note2id[MIDI.keyToNote[key]] = key;
+ notes[key] = {
+ id: key
+ };
+ }
+ setPlugin(root);
+ ///
+ if (conf.callback) conf.callback();
+ };
+})();
+
+/*
+ --------------------------------------------
+ Flash - MP3 Soundbank
+ --------------------------------------------
+ http://www.schillmania.com/projects/soundmanager2/
+ --------------------------------------------
+*/
+
+(function () {
+
+ var root = MIDI.Flash = {
+ api: "flash"
+ };
+ var noteReverse = {};
+ var notes = {};
+
+ root.programChange = function (channel, program) {
+ MIDI.channels[channel].instrument = program;
+ };
+
+ root.setVolume = function (channel, note) {
+
+ };
+
+ root.noteOn = function (channel, note, velocity, delay) {
+ if (!MIDI.channels[channel]) return;
+ var instrument = MIDI.channels[channel].instrument;
+ var id = MIDI.GeneralMIDI.byId[instrument].number;
+ note = id + "" + noteReverse[note];
+ if (!notes[note]) return;
+ if (delay) {
+ return window.setTimeout(function() {
+ notes[note].play({ volume: velocity * 2 });
+ }, delay * 1000);
+ } else {
+ notes[note].play({ volume: velocity * 2 });
+ }
+ };
+
+ root.noteOff = function (channel, note, delay) {
+
+ };
+
+ root.chordOn = function (channel, chord, velocity, delay) {
+ if (!MIDI.channels[channel]) return;
+ var instrument = MIDI.channels[channel].instrument;
+ var id = MIDI.GeneralMIDI.byId[instrument].number;
+ for (var key in chord) {
+ var n = chord[key];
+ var note = id + "" + noteReverse[n];
+ if (notes[note]) {
+ notes[note].play({ volume: velocity * 2 });
+ }
+ }
+ };
+
+ root.chordOff = function (channel, chord, delay) {
+
+ };
+
+ root.stopAllNotes = function () {
+
+ };
+
+ root.connect = function (instruments, conf) {
+ soundManager.flashVersion = 9;
+ soundManager.useHTML5Audio = true;
+ soundManager.url = conf.soundManagerSwfUrl || '../inc/SoundManager2/swf/';
+ soundManager.useHighPerformance = true;
+ soundManager.wmode = 'transparent';
+ soundManager.flashPollingInterval = 1;
+ soundManager.debugMode = false;
+ soundManager.onload = function () {
+ var createBuffer = function(instrument, id, onload) {
+ var synth = MIDI.GeneralMIDI.byName[instrument];
+ var instrumentId = synth.number;
+ notes[instrumentId+""+id] = soundManager.createSound({
+ id: id,
+ url: MIDI.soundfontUrl + instrument + "-mp3/" + id + ".mp3",
+ multiShot: true,
+ autoLoad: true,
+ onload: onload
+ });
+ };
+ var loaded = [];
+ var samplesPerInstrument = 88;
+ var samplesToLoad = instruments.length * samplesPerInstrument;
+
+ for (var i = 0; i < instruments.length; i++) {
+ var instrument = instruments[i];
+ var onload = function () {
+ loaded.push(this.sID);
+ if (typeof (MIDI.loader) === "undefined") return;
+ MIDI.loader.update(null, "Processing: " + this.sID);
+ };
+ for (var j = 0; j < samplesPerInstrument; j++) {
+ var id = noteReverse[j + 21];
+ createBuffer(instrument, id, onload);
+ }
+ }
+ ///
+ setPlugin(root);
+ //
+ var interval = window.setInterval(function () {
+ if (loaded.length < samplesToLoad) return;
+ window.clearInterval(interval);
+ if (conf.callback) conf.callback();
+ }, 25);
+ };
+ soundManager.onerror = function () {
+
+ };
+ for (var key in MIDI.keyToNote) {
+ noteReverse[MIDI.keyToNote[key]] = key;
+ }
+ };
+})();
+
+/*
+ helper functions
+*/
+
+// instrument-tracker
+MIDI.GeneralMIDI = (function (arr) {
+ var clean = function(v) {
+ return v.replace(/[^a-z0-9 ]/gi, "").replace(/[ ]/g, "_").toLowerCase();
+ };
+ var ret = {
+ byName: {},
+ byId: {},
+ byCategory: {}
+ };
+ for (var key in arr) {
+ var list = arr[key];
+ for (var n = 0, length = list.length; n < length; n++) {
+ var instrument = list[n];
+ if (!instrument) continue;
+ var num = parseInt(instrument.substr(0, instrument.indexOf(" ")), 10);
+ instrument = instrument.replace(num + " ", "");
+ ret.byId[--num] =
+ ret.byName[clean(instrument)] =
+ ret.byCategory[clean(key)] = {
+ id: clean(instrument),
+ instrument: instrument,
+ number: num,
+ category: key
+ };
+ }
+ }
+ return ret;
+})({
+ 'Piano': ['1 Acoustic Grand Piano', '2 Bright Acoustic Piano', '3 Electric Grand Piano', '4 Honky-tonk Piano', '5 Electric Piano 1', '6 Electric Piano 2', '7 Harpsichord', '8 Clavinet'],
+ 'Chromatic Percussion': ['9 Celesta', '10 Glockenspiel', '11 Music Box', '12 Vibraphone', '13 Marimba', '14 Xylophone', '15 Tubular Bells', '16 Dulcimer'],
+ 'Organ': ['17 Drawbar Organ', '18 Percussive Organ', '19 Rock Organ', '20 Church Organ', '21 Reed Organ', '22 Accordion', '23 Harmonica', '24 Tango Accordion'],
+ 'Guitar': ['25 Acoustic Guitar (nylon)', '26 Acoustic Guitar (steel)', '27 Electric Guitar (jazz)', '28 Electric Guitar (clean)', '29 Electric Guitar (muted)', '30 Overdriven Guitar', '31 Distortion Guitar', '32 Guitar Harmonics'],
+ 'Bass': ['33 Acoustic Bass', '34 Electric Bass (finger)', '35 Electric Bass (pick)', '36 Fretless Bass', '37 Slap Bass 1', '38 Slap Bass 2', '39 Synth Bass 1', '40 Synth Bass 2'],
+ 'Strings': ['41 Violin', '42 Viola', '43 Cello', '44 Contrabass', '45 Tremolo Strings', '46 Pizzicato Strings', '47 Orchestral Harp', '48 Timpani'],
+ 'Ensemble': ['49 String Ensemble 1', '50 String Ensemble 2', '51 Synth Strings 1', '52 Synth Strings 2', '53 Choir Aahs', '54 Voice Oohs', '55 Synth Choir', '56 Orchestra Hit'],
+ 'Brass': ['57 Trumpet', '58 Trombone', '59 Tuba', '60 Muted Trumpet', '61 French Horn', '62 Brass Section', '63 Synth Brass 1', '64 Synth Brass 2'],
+ 'Reed': ['65 Soprano Sax', '66 Alto Sax', '67 Tenor Sax', '68 Baritone Sax', '69 Oboe', '70 English Horn', '71 Bassoon', '72 Clarinet'],
+ 'Pipe': ['73 Piccolo', '74 Flute', '75 Recorder', '76 Pan Flute', '77 Blown Bottle', '78 Shakuhachi', '79 Whistle', '80 Ocarina'],
+ 'Synth Lead': ['81 Lead 1 (square)', '82 Lead 2 (sawtooth)', '83 Lead 3 (calliope)', '84 Lead 4 (chiff)', '85 Lead 5 (charang)', '86 Lead 6 (voice)', '87 Lead 7 (fifths)', '88 Lead 8 (bass + lead)'],
+ 'Synth Pad': ['89 Pad 1 (new age)', '90 Pad 2 (warm)', '91 Pad 3 (polysynth)', '92 Pad 4 (choir)', '93 Pad 5 (bowed)', '94 Pad 6 (metallic)', '95 Pad 7 (halo)', '96 Pad 8 (sweep)'],
+ 'Synth Effects': ['97 FX 1 (rain)', '98 FX 2 (soundtrack)', '99 FX 3 (crystal)', '100 FX 4 (atmosphere)', '101 FX 5 (brightness)', '102 FX 6 (goblins)', '103 FX 7 (echoes)', '104 FX 8 (sci-fi)'],
+ 'Ethnic': ['105 Sitar', '106 Banjo', '107 Shamisen', '108 Koto', '109 Kalimba', '110 Bagpipe', '111 Fiddle', '112 Shanai'],
+ 'Percussive': ['113 Tinkle Bell', '114 Agogo', '115 Steel Drums', '116 Woodblock', '117 Taiko Drum', '118 Melodic Tom', '119 Synth Drum'],
+ 'Sound effects': ['120 Reverse Cymbal', '121 Guitar Fret Noise', '122 Breath Noise', '123 Seashore', '124 Bird Tweet', '125 Telephone Ring', '126 Helicopter', '127 Applause', '128 Gunshot']
+});
+
+// channel-tracker
+MIDI.channels = (function () { // 0 - 15 channels
+ var channels = {};
+ for (var n = 0; n < 16; n++) {
+ channels[n] = { // default values
+ instrument: 0,
+ // Acoustic Grand Piano
+ mute: false,
+ mono: false,
+ omni: false,
+ solo: false
+ };
+ }
+ return channels;
+})();
+
+//
+MIDI.pianoKeyOffset = 21;
+
+// note conversions
+MIDI.keyToNote = {}; // C8 == 108
+MIDI.noteToKey = {}; // 108 == C8
+(function () {
+ var A0 = 0x15; // first note
+ var C8 = 0x6C; // last note
+ var number2key = ["C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B"];
+ for (var n = A0; n <= C8; n++) {
+ var octave = (n - 12) / 12 >> 0;
+ var name = number2key[n % 12] + octave;
+ MIDI.keyToNote[name] = n;
+ MIDI.noteToKey[n] = name;
+ }
+})();
+
+})(); \ No newline at end of file
diff --git a/Processing-js/libs/js/Window/DOMLoader.XMLHttp.js b/Processing-js/libs/js/Window/DOMLoader.XMLHttp.js
new file mode 100644
index 0000000..8384051
--- /dev/null
+++ b/Processing-js/libs/js/Window/DOMLoader.XMLHttp.js
@@ -0,0 +1,130 @@
+/*
+
+ DOMLoader.XMLHttp
+ --------------------------
+ DOMLoader.sendRequest({
+ url: "./dir/something.extension",
+ data: "test!",
+ onerror: function(event) {
+ console.log(event);
+ },
+ onload: function(response) {
+ console.log(response.responseText);
+ },
+ onprogress: function (event) {
+ var percent = event.loaded / event.total * 100 >> 0;
+ loader.message("loading: " + percent + "%");
+ }
+ });
+
+*/
+
+if (typeof(DOMLoader) === "undefined") var DOMLoader = {};
+
+// Add XMLHttpRequest when not available
+
+if (typeof (XMLHttpRequest) === "undefined") {
+ var XMLHttpRequest;
+ (function () { // find equivalent for IE
+ var factories = [
+ function () {
+ return new ActiveXObject("Msxml2.XMLHTTP")
+ }, function () {
+ return new ActiveXObject("Msxml3.XMLHTTP")
+ }, function () {
+ return new ActiveXObject("Microsoft.XMLHTTP")
+ }];
+ for (var i = 0; i < factories.length; i++) {
+ try {
+ factories[i]();
+ } catch (e) {
+ continue;
+ }
+ break;
+ }
+ XMLHttpRequest = factories[i];
+ })();
+}
+
+if (typeof ((new XMLHttpRequest()).responseText) === "undefined") {
+ // http://stackoverflow.com/questions/1919972/how-do-i-access-xhr-responsebody-for-binary-data-from-javascript-in-ie
+ var IEBinaryToArray_ByteStr_Script =
+ "<!-- IEBinaryToArray_ByteStr -->\r\n"+
+ "<script type='text/vbscript'>\r\n"+
+ "Function IEBinaryToArray_ByteStr(Binary)\r\n"+
+ " IEBinaryToArray_ByteStr = CStr(Binary)\r\n"+
+ "End Function\r\n"+
+ "Function IEBinaryToArray_ByteStr_Last(Binary)\r\n"+
+ " Dim lastIndex\r\n"+
+ " lastIndex = LenB(Binary)\r\n"+
+ " if lastIndex mod 2 Then\r\n"+
+ " IEBinaryToArray_ByteStr_Last = Chr( AscB( MidB( Binary, lastIndex, 1 ) ) )\r\n"+
+ " Else\r\n"+
+ " IEBinaryToArray_ByteStr_Last = "+'""'+"\r\n"+
+ " End If\r\n"+
+ "End Function\r\n"+
+ "</script>\r\n";
+
+ // inject VBScript
+ document.write(IEBinaryToArray_ByteStr_Script);
+
+ DOMLoader.sendRequest = function(conf) {
+ // helper to convert from responseBody to a "responseText" like thing
+ function getResponseText(binary) {
+ var byteMapping = {};
+ for (var i = 0; i < 256; i++) {
+ for (var j = 0; j < 256; j++) {
+ byteMapping[String.fromCharCode(i + j * 256)] = String.fromCharCode(i) + String.fromCharCode(j);
+ }
+ }
+ // call into VBScript utility fns
+ var rawBytes = IEBinaryToArray_ByteStr(binary);
+ var lastChr = IEBinaryToArray_ByteStr_Last(binary);
+ return rawBytes.replace(/[\s\S]/g, function (match) {
+ return byteMapping[match];
+ }) + lastChr;
+ };
+ //
+ var req = XMLHttpRequest();
+ req.open("GET", conf.url, true);
+ if (conf.responseType) req.responseType = conf.responseType;
+ if (conf.onerror) req.onerror = conf.onerror;
+ if (conf.onprogress) req.onprogress = conf.onprogress;
+ req.onreadystatechange = function (event) {
+ if (req.readyState === 4) {
+ if (req.status === 200) {
+ req.responseText = getResponseText(req.responseBody);
+ } else {
+ req = false;
+ }
+ if (conf.onload) conf.onload(req);
+ }
+ };
+ req.setRequestHeader("Accept-Charset", "x-user-defined");
+ req.send(null);
+ return req;
+ }
+} else {
+ DOMLoader.sendRequest = function(conf) {
+ var req = new XMLHttpRequest();
+ req.open(conf.data ? "POST" : "GET", conf.url, true);
+ if (req.overrideMimeType) req.overrideMimeType("text/plain; charset=x-user-defined");
+ if (conf.data) req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
+ if (conf.responseType) req.responseType = conf.responseType;
+ if (conf.onerror) req.onerror = conf.onerror;
+ if (conf.onprogress) req.onprogress = conf.onprogress;
+ req.onreadystatechange = function (event) {
+ if (req.readyState === 4) {
+ if (req.status !== 200 && req.status != 304) {
+ if (conf.onerror) conf.onerror(event, false);
+ return;
+ }
+ if (conf.onload) {
+ conf.onload(req);
+ }
+ }
+ };
+ req.send(conf.data);
+ return req;
+ };
+} \ No newline at end of file
diff --git a/Processing-js/libs/js/Window/Event.js b/Processing-js/libs/js/Window/Event.js
new file mode 100644
index 0000000..db9215b
--- /dev/null
+++ b/Processing-js/libs/js/Window/Event.js
@@ -0,0 +1,1901 @@
+/*:
+ ----------------------------------------------------
+ event.js : 1.1.5 : 2013/12/12 : MIT License
+ ----------------------------------------------------
+ https://github.com/mudcube/Event.js
+ ----------------------------------------------------
+ 1 : click, dblclick, dbltap
+ 1+ : tap, longpress, drag, swipe
+ 2+ : pinch, rotate
+ : mousewheel, devicemotion, shake
+ ----------------------------------------------------
+ Ideas for the future
+ ----------------------------------------------------
+ * GamePad, and other input abstractions.
+ * Event batching - i.e. for every x fingers down a new gesture is created.
+ ----------------------------------------------------
+ http://www.w3.org/TR/2011/WD-touch-events-20110505/
+ ----------------------------------------------------
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+
+(function(root) { "use strict";
+
+// Add custom *EventListener commands to HTMLElements (set false to prevent funkiness).
+root.modifyEventListener = false;
+
+// Add bulk *EventListener commands on NodeLists from querySelectorAll and others (set false to prevent funkiness).
+root.modifySelectors = false;
+
+// Event maintenance.
+root.add = function(target, type, listener, configure) {
+ return eventManager(target, type, listener, configure, "add");
+};
+
+root.remove = function(target, type, listener, configure) {
+ return eventManager(target, type, listener, configure, "remove");
+};
+
+root.returnFalse = function(event) {
+ return false;
+};
+
+root.stop = function(event) {
+ if (!event) return;
+ if (event.stopPropagation) event.stopPropagation();
+ event.cancelBubble = true; // <= IE8
+ event.cancelBubbleCount = 0;
+};
+
+root.prevent = function(event) {
+ if (!event) return;
+ if (event.preventDefault) {
+ event.preventDefault();
+ } else if (event.preventManipulation) {
+ event.preventManipulation(); // MS
+ } else {
+ event.returnValue = false; // <= IE8
+ }
+};
+
+root.cancel = function(event) {
+ root.stop(event);
+ root.prevent(event);
+};
+
+root.blur = function() { // Blurs the focused element. Useful when using eventjs.cancel as canceling will prevent focused elements from being blurred.
+ var node = document.activeElement;
+ if (!node) return;
+ var nodeName = document.activeElement.nodeName;
+ if (nodeName === "INPUT" || nodeName === "TEXTAREA" || node.contentEditable === "true") {
+ if (node.blur) node.blur();
+ }
+};
+
+// Check whether event is natively supported (via @kangax)
+root.getEventSupport = function (target, type) {
+ if (typeof(target) === "string") {
+ type = target;
+ target = window;
+ }
+ type = "on" + type;
+ if (type in target) return true;
+ if (!target.setAttribute) target = document.createElement("div");
+ if (target.setAttribute && target.removeAttribute) {
+ target.setAttribute(type, "");
+ var isSupported = typeof target[type] === "function";
+ if (typeof target[type] !== "undefined") target[type] = null;
+ target.removeAttribute(type);
+ return isSupported;
+ }
+};
+
+var clone = function (obj) {
+ if (!obj || typeof (obj) !== 'object') return obj;
+ var temp = new obj.constructor();
+ for (var key in obj) {
+ if (!obj[key] || typeof (obj[key]) !== 'object') {
+ temp[key] = obj[key];
+ } else { // clone sub-object
+ temp[key] = clone(obj[key]);
+ }
+ }
+ return temp;
+};
+
+/// Handle custom *EventListener commands.
+var eventManager = function(target, type, listener, configure, trigger, fromOverwrite) {
+ configure = configure || {};
+ // Check whether target is a configuration variable;
+ if (String(target) === "[object Object]") {
+ var data = target;
+ target = data.target; delete data.target;
+ ///
+ if (data.type && data.listener) {
+ type = data.type; delete data.type;
+ listener = data.listener; delete data.listener;
+ for (var key in data) {
+ configure[key] = data[key];
+ }
+ } else { // specialness
+ for (var param in data) {
+ var value = data[param];
+ if (typeof(value) === "function") continue;
+ configure[param] = value;
+ }
+ ///
+ var ret = {};
+ for (var key in data) {
+ var param = key.split(",");
+ var o = data[key];
+ var conf = {};
+ for (var k in configure) { // clone base configuration
+ conf[k] = configure[k];
+ }
+ ///
+ if (typeof(o) === "function") { // without configuration
+ var listener = o;
+ } else if (typeof(o.listener) === "function") { // with configuration
+ var listener = o.listener;
+ for (var k in o) { // merge configure into base configuration
+ if (typeof(o[k]) === "function") continue;
+ conf[k] = o[k];
+ }
+ } else { // not a listener
+ continue;
+ }
+ ///
+ for (var n = 0; n < param.length; n ++) {
+ ret[key] = eventjs.add(target, param[n], listener, conf, trigger);
+ }
+ }
+ return ret;
+ }
+ }
+ ///
+ if (!target || !type || !listener) return;
+ // Check for element to load on interval (before onload).
+ if (typeof(target) === "string" && type === "ready") {
+ if (window.eventjs_stallOnReady) { /// force stall for scripts to load
+ type = "load";
+ target = window;
+ } else { //
+ var time = (new Date()).getTime();
+ var timeout = configure.timeout;
+ var ms = configure.interval || 1000 / 60;
+ var interval = window.setInterval(function() {
+ if ((new Date()).getTime() - time > timeout) {
+ window.clearInterval(interval);
+ }
+ if (document.querySelector(target)) {
+ window.clearInterval(interval);
+ setTimeout(listener, 1);
+ }
+ }, ms);
+ return;
+ }
+ }
+ // Get DOM element from Query Selector.
+ if (typeof(target) === "string") {
+ target = document.querySelectorAll(target);
+ if (target.length === 0) return createError("Missing target on listener!", arguments); // No results.
+ if (target.length === 1) { // Single target.
+ target = target[0];
+ }
+ }
+
+ /// Handle multiple targets.
+ var event;
+ var events = {};
+ if (target.length > 0 && target !== window) {
+ for (var n0 = 0, length0 = target.length; n0 < length0; n0 ++) {
+ event = eventManager(target[n0], type, listener, clone(configure), trigger);
+ if (event) events[n0] = event;
+ }
+ return createBatchCommands(events);
+ }
+
+ /// Check for multiple events in one string.
+ if (typeof(type) === "string") {
+ type = type.toLowerCase();
+ if (type.indexOf(" ") !== -1) {
+ type = type.split(" ");
+ } else if (type.indexOf(",") !== -1) {
+ type = type.split(",");
+ }
+ }
+
+ /// Attach or remove multiple events associated with a target.
+ if (typeof(type) !== "string") { // Has multiple events.
+ if (typeof(type.length) === "number") { // Handle multiple listeners glued together.
+ for (var n1 = 0, length1 = type.length; n1 < length1; n1 ++) { // Array [type]
+ event = eventManager(target, type[n1], listener, clone(configure), trigger);
+ if (event) events[type[n1]] = event;
+ }
+ } else { // Handle multiple listeners.
+ for (var key in type) { // Object {type}
+ if (typeof(type[key]) === "function") { // without configuration.
+ event = eventManager(target, key, type[key], clone(configure), trigger);
+ } else { // with configuration.
+ event = eventManager(target, key, type[key].listener, clone(type[key]), trigger);
+ }
+ if (event) events[key] = event;
+ }
+ }
+ return createBatchCommands(events);
+ } else if (type.indexOf("on") === 0) { // to support things like "onclick" instead of "click"
+ type = type.substr(2);
+ }
+
+ // Ensure listener is a function.
+ if (typeof(target) !== "object") return createError("Target is not defined!", arguments);
+ if (typeof(listener) !== "function") return createError("Listener is not a function!", arguments);
+
+ // Generate a unique wrapper identifier.
+ var useCapture = configure.useCapture || false;
+ var id = getID(target) + "." + getID(listener) + "." + (useCapture ? 1 : 0);
+ // Handle the event.
+ if (root.Gesture && root.Gesture._gestureHandlers[type]) { // Fire custom event.
+ id = type + id;
+ if (trigger === "remove") { // Remove event listener.
+ if (!wrappers[id]) return; // Already removed.
+ wrappers[id].remove();
+ delete wrappers[id];
+ } else if (trigger === "add") { // Attach event listener.
+ if (wrappers[id]) {
+ wrappers[id].add();
+ return wrappers[id]; // Already attached.
+ }
+ // Retains "this" orientation.
+ if (configure.useCall && !root.modifyEventListener) {
+ var tmp = listener;
+ listener = function(event, self) {
+ for (var key in self) event[key] = self[key];
+ return tmp.call(target, event);
+ };
+ }
+ // Create listener proxy.
+ configure.gesture = type;
+ configure.target = target;
+ configure.listener = listener;
+ configure.fromOverwrite = fromOverwrite;
+ // Record wrapper.
+ wrappers[id] = root.proxy[type](configure);
+ }
+ return wrappers[id];
+ } else { // Fire native event.
+ var eventList = getEventList(type);
+ for (var n = 0, eventId; n < eventList.length; n ++) {
+ type = eventList[n];
+ eventId = type + "." + id;
+ if (trigger === "remove") { // Remove event listener.
+ if (!wrappers[eventId]) continue; // Already removed.
+ target[remove](type, listener, useCapture);
+ delete wrappers[eventId];
+ } else if (trigger === "add") { // Attach event listener.
+ if (wrappers[eventId]) return wrappers[eventId]; // Already attached.
+ target[add](type, listener, useCapture);
+ // Record wrapper.
+ wrappers[eventId] = {
+ id: eventId,
+ type: type,
+ target: target,
+ listener: listener,
+ remove: function() {
+ for (var n = 0; n < eventList.length; n ++) {
+ root.remove(target, eventList[n], listener, configure);
+ }
+ }
+ };
+ }
+ }
+ return wrappers[eventId];
+ }
+};
+
+/// Perform batch actions on multiple events.
+var createBatchCommands = function(events) {
+ return {
+ remove: function() { // Remove multiple events.
+ for (var key in events) {
+ events[key].remove();
+ }
+ },
+ add: function() { // Add multiple events.
+ for (var key in events) {
+ events[key].add();
+ }
+ }
+ };
+};
+
+/// Display error message in console.
+var createError = function(message, data) {
+ if (typeof(console) === "undefined") return;
+ if (typeof(console.error) === "undefined") return;
+ console.error(message, data);
+};
+
+/// Handle naming discrepancies between platforms.
+var pointerDefs = {
+ "msPointer": [ "MSPointerDown", "MSPointerMove", "MSPointerUp" ],
+ "touch": [ "touchstart", "touchmove", "touchend" ],
+ "mouse": [ "mousedown", "mousemove", "mouseup" ]
+};
+
+var pointerDetect = {
+ // MSPointer
+ "MSPointerDown": 0,
+ "MSPointerMove": 1,
+ "MSPointerUp": 2,
+ // Touch
+ "touchstart": 0,
+ "touchmove": 1,
+ "touchend": 2,
+ // Mouse
+ "mousedown": 0,
+ "mousemove": 1,
+ "mouseup": 2
+};
+
+var getEventSupport = (function() {
+ root.supports = {};
+ if (window.navigator.msPointerEnabled) {
+ root.supports.msPointer = true;
+ }
+ if (root.getEventSupport("touchstart")) {
+ root.supports.touch = true;
+ }
+ if (root.getEventSupport("mousedown")) {
+ root.supports.mouse = true;
+ }
+})();
+
+var getEventList = (function() {
+ return function(type) {
+ var prefix = document.addEventListener ? "" : "on"; // IE
+ var idx = pointerDetect[type];
+ if (isFinite(idx)) {
+ var types = [];
+ for (var key in root.supports) {
+ types.push(prefix + pointerDefs[key][idx]);
+ }
+ return types;
+ } else {
+ return [ prefix + type ];
+ }
+ };
+})();
+
+/// Event wrappers to keep track of all events placed in the window.
+var wrappers = {};
+var counter = 0;
+var getID = function(object) {
+ if (object === window) return "#window";
+ if (object === document) return "#document";
+ if (!object.uniqueID) object.uniqueID = "e" + counter ++;
+ return object.uniqueID;
+};
+
+/// Detect platforms native *EventListener command.
+var add = document.addEventListener ? "addEventListener" : "attachEvent";
+var remove = document.removeEventListener ? "removeEventListener" : "detachEvent";
+
+/*
+ Pointer.js
+ ----------------------------------------
+ Modified from; https://github.com/borismus/pointer.js
+*/
+
+root.createPointerEvent = function (event, self, preventRecord) {
+ var eventName = self.gesture;
+ var target = self.target;
+ var pts = event.changedTouches || root.proxy.getCoords(event);
+ if (pts.length) {
+ var pt = pts[0];
+ self.pointers = preventRecord ? [] : pts;
+ self.pageX = pt.pageX;
+ self.pageY = pt.pageY;
+ self.x = self.pageX;
+ self.y = self.pageY;
+ }
+ ///
+ var newEvent = document.createEvent("Event");
+ newEvent.initEvent(eventName, true, true);
+ newEvent.originalEvent = event;
+ for (var k in self) {
+ if (k === "target") continue;
+ newEvent[k] = self[k];
+ }
+ ///
+ var type = newEvent.type;
+ if (root.Gesture && root.Gesture._gestureHandlers[type]) { // capture custom events.
+// target.dispatchEvent(newEvent);
+ self.oldListener.call(target, newEvent, self, false);
+ }
+};
+
+/// Allows *EventListener to use custom event proxies.
+if (root.modifyEventListener && window.HTMLElement) (function() {
+ var augmentEventListener = function(proto) {
+ var recall = function(trigger) { // overwrite native *EventListener's
+ var handle = trigger + "EventListener";
+ var handler = proto[handle];
+ proto[handle] = function (type, listener, useCapture) {
+ if (root.Gesture && root.Gesture._gestureHandlers[type]) { // capture custom events.
+ var configure = useCapture;
+ if (typeof(useCapture) === "object") {
+ configure.useCall = true;
+ } else { // convert to configuration object.
+ configure = {
+ useCall: true,
+ useCapture: useCapture
+ };
+ }
+ eventManager(this, type, listener, configure, trigger, true);
+// handler.call(this, type, listener, useCapture);
+ } else { // use native function.
+ var types = getEventList(type);
+ for (var n = 0; n < types.length; n ++) {
+ handler.call(this, types[n], listener, useCapture);
+ }
+ }
+ };
+ };
+ recall("add");
+ recall("remove");
+ };
+ // NOTE: overwriting HTMLElement doesn't do anything in Firefox.
+ if (navigator.userAgent.match(/Firefox/)) {
+ // TODO: fix Firefox for the general case.
+ augmentEventListener(HTMLDivElement.prototype);
+ augmentEventListener(HTMLCanvasElement.prototype);
+ } else {
+ augmentEventListener(HTMLElement.prototype);
+ }
+ augmentEventListener(document);
+ augmentEventListener(window);
+})();
+
+/// Allows querySelectorAll and other NodeLists to perform *EventListener commands in bulk.
+if (root.modifySelectors) (function() {
+ var proto = NodeList.prototype;
+ proto.removeEventListener = function(type, listener, useCapture) {
+ for (var n = 0, length = this.length; n < length; n ++) {
+ this[n].removeEventListener(type, listener, useCapture);
+ }
+ };
+ proto.addEventListener = function(type, listener, useCapture) {
+ for (var n = 0, length = this.length; n < length; n ++) {
+ this[n].addEventListener(type, listener, useCapture);
+ }
+ };
+})();
+
+return root;
+
+})(eventjs);
+/*:
+ ----------------------------------------------------
+ eventjs.proxy : 0.4.2 : 2013/07/17 : MIT License
+ ----------------------------------------------------
+ https://github.com/mudcube/eventjs.js
+ ----------------------------------------------------
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+/*
+ Create a new pointer gesture instance.
+*/
+
+root.pointerSetup = function(conf, self) {
+ /// Configure.
+ conf.target = conf.target || window;
+ conf.doc = conf.target.ownerDocument || conf.target; // Associated document.
+ conf.minFingers = conf.minFingers || conf.fingers || 1; // Minimum required fingers.
+ conf.maxFingers = conf.maxFingers || conf.fingers || Infinity; // Maximum allowed fingers.
+ conf.position = conf.position || "relative"; // Determines what coordinate system points are returned.
+ delete conf.fingers; //-
+ /// Convenience data.
+ self = self || {};
+ self.enabled = true;
+ self.gesture = conf.gesture;
+ self.target = conf.target;
+ self.env = conf.env;
+ ///
+ if (eventjs.modifyEventListener && conf.fromOverwrite) {
+ conf.oldListener = conf.listener;
+ conf.listener = eventjs.createPointerEvent;
+ }
+ /// Convenience commands.
+ var fingers = 0;
+ var type = self.gesture.indexOf("pointer") === 0 && eventjs.modifyEventListener ? "pointer" : "mouse";
+ if (conf.oldListener) self.oldListener = conf.oldListener;
+ ///
+ self.listener = conf.listener;
+ self.proxy = function(listener) {
+ self.defaultListener = conf.listener;
+ conf.listener = listener;
+ listener(conf.event, self);
+ };
+ self.add = function() {
+ if (self.enabled === true) return;
+ if (conf.onPointerDown) eventjs.add(conf.target, type + "down", conf.onPointerDown);
+ if (conf.onPointerMove) eventjs.add(conf.doc, type + "move", conf.onPointerMove);
+ if (conf.onPointerUp) eventjs.add(conf.doc, type + "up", conf.onPointerUp);
+ self.enabled = true;
+ };
+ self.remove = function() {
+ if (self.enabled === false) return;
+ if (conf.onPointerDown) eventjs.remove(conf.target, type + "down", conf.onPointerDown);
+ if (conf.onPointerMove) eventjs.remove(conf.doc, type + "move", conf.onPointerMove);
+ if (conf.onPointerUp) eventjs.remove(conf.doc, type + "up", conf.onPointerUp);
+ self.reset();
+ self.enabled = false;
+ };
+ self.pause = function(opt) {
+ if (conf.onPointerMove && (!opt || opt.move)) eventjs.remove(conf.doc, type + "move", conf.onPointerMove);
+ if (conf.onPointerUp && (!opt || opt.up)) eventjs.remove(conf.doc, type + "up", conf.onPointerUp);
+ fingers = conf.fingers;
+ conf.fingers = 0;
+ };
+ self.resume = function(opt) {
+ if (conf.onPointerMove && (!opt || opt.move)) eventjs.add(conf.doc, type + "move", conf.onPointerMove);
+ if (conf.onPointerUp && (!opt || opt.up)) eventjs.add(conf.doc, type + "up", conf.onPointerUp);
+ conf.fingers = fingers;
+ };
+ self.reset = function() {
+ conf.tracker = {};
+ conf.fingers = 0;
+ };
+ ///
+ return self;
+};
+
+/*
+ Begin proxied pointer command.
+*/
+
+var sp = eventjs.supports; // Default pointerType
+///
+eventjs.isMouse = !!sp.mouse;
+eventjs.isMSPointer = !!sp.touch;
+eventjs.isTouch = !!sp.msPointer;
+///
+root.pointerStart = function(event, self, conf) {
+ /// tracks multiple inputs
+ var type = (event.type || "mousedown").toUpperCase();
+ if (type.indexOf("MOUSE") === 0) {
+ eventjs.isMouse = true;
+ eventjs.isTouch = false;
+ eventjs.isMSPointer = false;
+ } else if (type.indexOf("TOUCH") === 0) {
+ eventjs.isMouse = false;
+ eventjs.isTouch = true;
+ eventjs.isMSPointer = false;
+ } else if (type.indexOf("MSPOINTER") === 0) {
+ eventjs.isMouse = false;
+ eventjs.isTouch = false;
+ eventjs.isMSPointer = true;
+ }
+ ///
+ var addTouchStart = function(touch, sid) {
+ var bbox = conf.bbox;
+ var pt = track[sid] = {};
+ ///
+ switch(conf.position) {
+ case "absolute": // Absolute from within window.
+ pt.offsetX = 0;
+ pt.offsetY = 0;
+ break;
+ case "differenceFromLast": // Since last coordinate recorded.
+ pt.offsetX = touch.pageX;
+ pt.offsetY = touch.pageY;
+ break;
+ case "difference": // Relative from origin.
+ pt.offsetX = touch.pageX;
+ pt.offsetY = touch.pageY;
+ break;
+ case "move": // Move target element.
+ pt.offsetX = touch.pageX - bbox.x1;
+ pt.offsetY = touch.pageY - bbox.y1;
+ break;
+ default: // Relative from within target.
+ pt.offsetX = bbox.x1 - bbox.scrollLeft;
+ pt.offsetY = bbox.y1 - bbox.scrollTop;
+ break;
+ }
+ ///
+ var x = touch.pageX - pt.offsetX;
+ var y = touch.pageY - pt.offsetY;
+ ///
+ pt.rotation = 0;
+ pt.scale = 1;
+ pt.startTime = pt.moveTime = (new Date()).getTime();
+ pt.move = { x: x, y: y };
+ pt.start = { x: x, y: y };
+ ///
+ conf.fingers ++;
+ };
+ ///
+ conf.event = event;
+ if (self.defaultListener) {
+ conf.listener = self.defaultListener;
+ delete self.defaultListener;
+ }
+ ///
+ var isTouchStart = !conf.fingers;
+ var track = conf.tracker;
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ // Adding touch events to tracking.
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var sid = touch.identifier || Infinity; // Touch ID.
+ // Track the current state of the touches.
+ if (conf.fingers) {
+ if (conf.fingers >= conf.maxFingers) {
+ var ids = [];
+ for (var sid in conf.tracker) ids.push(sid);
+ self.identifier = ids.join(",");
+ return isTouchStart;
+ }
+ var fingers = 0; // Finger ID.
+ for (var rid in track) {
+ // Replace removed finger.
+ if (track[rid].up) {
+ delete track[rid];
+ addTouchStart(touch, sid);
+ conf.cancel = true;
+ break;
+ }
+ fingers ++;
+ }
+ // Add additional finger.
+ if (track[sid]) continue;
+ addTouchStart(touch, sid);
+ } else { // Start tracking fingers.
+ track = conf.tracker = {};
+ self.bbox = conf.bbox = root.getBoundingBox(conf.target);
+ conf.fingers = 0;
+ conf.cancel = false;
+ addTouchStart(touch, sid);
+ }
+ }
+ ///
+ var ids = [];
+ for (var sid in conf.tracker) ids.push(sid);
+ self.identifier = ids.join(",");
+ ///
+ return isTouchStart;
+};
+
+/*
+ End proxied pointer command.
+*/
+
+root.pointerEnd = function(event, self, conf, onPointerUp) {
+ // Record changed touches have ended (iOS changedTouches is not reliable).
+ var touches = event.touches || [];
+ var length = touches.length;
+ var exists = {};
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var sid = touch.identifier;
+ exists[sid || Infinity] = true;
+ }
+ for (var sid in conf.tracker) {
+ var track = conf.tracker[sid];
+ if (exists[sid] || track.up) continue;
+ if (onPointerUp) { // add changedTouches to mouse.
+ onPointerUp({
+ pageX: track.pageX,
+ pageY: track.pageY,
+ changedTouches: [{
+ pageX: track.pageX,
+ pageY: track.pageY,
+ identifier: sid === "Infinity" ? Infinity : sid
+ }]
+ }, "up");
+ }
+ track.up = true;
+ conf.fingers --;
+ }
+/* // This should work but fails in Safari on iOS4 so not using it.
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ // Record changed touches have ended (this should work).
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var sid = touch.identifier || Infinity;
+ var track = conf.tracker[sid];
+ if (track && !track.up) {
+ if (onPointerUp) { // add changedTouches to mouse.
+ onPointerUp({
+ changedTouches: [{
+ pageX: track.pageX,
+ pageY: track.pageY,
+ identifier: sid === "Infinity" ? Infinity : sid
+ }]
+ }, "up");
+ }
+ track.up = true;
+ conf.fingers --;
+ }
+ } */
+ // Wait for all fingers to be released.
+ if (conf.fingers !== 0) return false;
+ // Record total number of fingers gesture used.
+ var ids = [];
+ conf.gestureFingers = 0;
+ for (var sid in conf.tracker) {
+ conf.gestureFingers ++;
+ ids.push(sid);
+ }
+ self.identifier = ids.join(",");
+ // Our pointer gesture has ended.
+ return true;
+};
+
+/*
+ Returns mouse coords in an array to match event.*Touches
+ ------------------------------------------------------------
+ var touch = event.changedTouches || root.getCoords(event);
+*/
+
+root.getCoords = function(event) {
+ if (typeof(event.pageX) !== "undefined") { // Desktop browsers.
+ root.getCoords = function(event) {
+ return Array({
+ type: "mouse",
+ x: event.pageX,
+ y: event.pageY,
+ pageX: event.pageX,
+ pageY: event.pageY,
+ identifier: event.pointerId || Infinity // pointerId is MS
+ });
+ };
+ } else { // Internet Explorer <= 8.0
+ root.getCoords = function(event) {
+ var doc = document.documentElement;
+ event = event || window.event;
+ return Array({
+ type: "mouse",
+ x: event.clientX + doc.scrollLeft,
+ y: event.clientY + doc.scrollTop,
+ pageX: event.clientX + doc.scrollLeft,
+ pageY: event.clientY + doc.scrollTop,
+ identifier: Infinity
+ });
+ };
+ }
+ return root.getCoords(event);
+};
+
+/*
+ Returns single coords in an object.
+ ------------------------------------------------------------
+ var mouse = root.getCoord(event);
+*/
+
+root.getCoord = function(event) {
+ if ("ontouchstart" in window) { // Mobile browsers.
+ var pX = 0;
+ var pY = 0;
+ root.getCoord = function(event) {
+ var touches = event.changedTouches;
+ if (touches && touches.length) { // ontouchstart + ontouchmove
+ return {
+ x: pX = touches[0].pageX,
+ y: pY = touches[0].pageY
+ };
+ } else { // ontouchend
+ return {
+ x: pX,
+ y: pY
+ };
+ }
+ };
+ } else if(typeof(event.pageX) !== "undefined" && typeof(event.pageY) !== "undefined") { // Desktop browsers.
+ root.getCoord = function(event) {
+ return {
+ x: event.pageX,
+ y: event.pageY
+ };
+ };
+ } else { // Internet Explorer <=8.0
+ root.getCoord = function(event) {
+ var doc = document.documentElement;
+ event = event || window.event;
+ return {
+ x: event.clientX + doc.scrollLeft,
+ y: event.clientY + doc.scrollTop
+ };
+ };
+ }
+ return root.getCoord(event);
+};
+
+/*
+ Get target scale and position in space.
+*/
+
+var getPropertyAsFloat = function(o, type) {
+ var n = parseFloat(o.getPropertyValue(type), 10);
+ return isFinite(n) ? n : 0;
+};
+
+root.getBoundingBox = function(o) {
+ if (o === window || o === document) o = document.body;
+ ///
+ var bbox = {};
+ var bcr = o.getBoundingClientRect();
+ bbox.width = bcr.width;
+ bbox.height = bcr.height;
+ bbox.x1 = bcr.left;
+ bbox.y1 = bcr.top;
+ bbox.scaleX = bcr.width / o.offsetWidth || 1;
+ bbox.scaleY = bcr.height / o.offsetHeight || 1;
+ bbox.scrollLeft = 0;
+ bbox.scrollTop = 0;
+ ///
+ var style = window.getComputedStyle(o);
+ var borderBox = style.getPropertyValue("box-sizing") === "border-box";
+ ///
+ if (borderBox === false) {
+ var left = getPropertyAsFloat(style, "border-left-width");
+ var right = getPropertyAsFloat(style, "border-right-width");
+ var bottom = getPropertyAsFloat(style, "border-bottom-width");
+ var top = getPropertyAsFloat(style, "border-top-width");
+ bbox.border = [ left, right, top, bottom ];
+ bbox.x1 += left;
+ bbox.y1 += top;
+ bbox.width -= right + left;
+ bbox.height -= bottom + top;
+ }
+
+/* var left = getPropertyAsFloat(style, "padding-left");
+ var right = getPropertyAsFloat(style, "padding-right");
+ var bottom = getPropertyAsFloat(style, "padding-bottom");
+ var top = getPropertyAsFloat(style, "padding-top");
+ bbox.padding = [ left, right, top, bottom ];*/
+ ///
+ bbox.x2 = bbox.x1 + bbox.width;
+ bbox.y2 = bbox.y1 + bbox.height;
+
+ /// Get the scroll of container element.
+ var position = style.getPropertyValue("position");
+ var tmp = position === "fixed" ? o : o.parentNode;
+ while (tmp !== null) {
+ if (tmp === document.body) break;
+ if (tmp.scrollTop === undefined) break;
+ var style = window.getComputedStyle(tmp);
+ var position = style.getPropertyValue("position");
+ if (position === "absolute") {
+
+ } else if (position === "fixed") {
+// bbox.scrollTop += document.body.scrollTop;
+// bbox.scrollLeft += document.body.scrollLeft;
+ bbox.scrollTop -= tmp.parentNode.scrollTop;
+ bbox.scrollLeft -= tmp.parentNode.scrollLeft;
+ break;
+ } else {
+ bbox.scrollLeft += tmp.scrollLeft;
+ bbox.scrollTop += tmp.scrollTop;
+ }
+ ///
+ tmp = tmp.parentNode;
+ };
+ ///
+ bbox.scrollBodyLeft = (window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft;
+ bbox.scrollBodyTop = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
+ ///
+ bbox.scrollLeft -= bbox.scrollBodyLeft;
+ bbox.scrollTop -= bbox.scrollBodyTop;
+ ///
+ return bbox;
+};
+
+/*
+ Keep track of metaKey, the proper ctrlKey for users platform.
+ ----------------------------------------------------
+ http://www.quirksmode.org/js/keys.html
+*/
+
+(function() {
+ var agent = navigator.userAgent.toLowerCase();
+ var mac = agent.indexOf("macintosh") !== -1;
+ var metaKeys;
+ if (mac && agent.indexOf("khtml") !== -1) { // chrome, safari.
+ metaKeys = { 91: true, 93: true };
+ } else if (mac && agent.indexOf("firefox") !== -1) { // mac firefox.
+ metaKeys = { 224: true };
+ } else { // windows, linux, or mac opera.
+ metaKeys = { 17: true };
+ }
+ (root.metaTrackerReset = function() {
+ eventjs.fnKey = root.fnKey = false;
+ eventjs.metaKey = root.metaKey = false;
+ eventjs.ctrlKey = root.ctrlKey = false;
+ eventjs.shiftKey = root.shiftKey = false;
+ eventjs.altKey = root.altKey = false;
+ })();
+ root.metaTracker = function(event) {
+ var metaCheck = !!metaKeys[event.keyCode];
+ if (metaCheck) eventjs.metaKey = root.metaKey = event.type === "keydown";
+ eventjs.ctrlKey = root.ctrlKey = event.ctrlKey;
+ eventjs.shiftKey = root.shiftKey = event.shiftKey;
+ eventjs.altKey = root.altKey = event.altKey;
+ return metaCheck;
+ };
+})();
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ ----------------------------------------------------
+ "MutationObserver" event proxy.
+ ----------------------------------------------------
+ author: Selvakumar Arumugam - MIT LICENSE
+ src: http://stackoverflow.com/questions/10868104/can-you-have-a-javascript-hook-trigger-after-a-dom-elements-style-object-change
+ ----------------------------------------------------
+*/
+if (typeof(eventjs) === "undefined") var eventjs = {};
+
+eventjs.MutationObserver = (function() {
+ var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
+ var DOMAttrModifiedSupported = !MutationObserver && (function() {
+ var p = document.createElement("p");
+ var flag = false;
+ var fn = function() { flag = true };
+ if (p.addEventListener) {
+ p.addEventListener("DOMAttrModified", fn, false);
+ } else if (p.attachEvent) {
+ p.attachEvent("onDOMAttrModified", fn);
+ } else {
+ return false;
+ }
+ ///
+ p.setAttribute("id", "target");
+ ///
+ return flag;
+ })();
+ ///
+ return function(container, callback) {
+ if (MutationObserver) {
+ var options = {
+ subtree: false,
+ attributes: true
+ };
+ var observer = new MutationObserver(function(mutations) {
+ mutations.forEach(function(e) {
+ callback.call(e.target, e.attributeName);
+ });
+ });
+ observer.observe(container, options)
+ } else if (DOMAttrModifiedSupported) {
+ eventjs.add(container, "DOMAttrModified", function(e) {
+ callback.call(container, e.attrName);
+ });
+ } else if ("onpropertychange" in document.body) {
+ eventjs.add(container, "propertychange", function(e) {
+ callback.call(container, window.event.propertyName);
+ });
+ }
+ }
+})();
+/*:
+ "Click" event proxy.
+ ----------------------------------------------------
+ eventjs.add(window, "click", function(event, self) {});
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.click = function(conf) {
+ conf.gesture = conf.gesture || "click";
+ conf.maxFingers = conf.maxFingers || conf.fingers || 1;
+ /// Tracking the events.
+ conf.onPointerDown = function (event) {
+ if (root.pointerStart(event, self, conf)) {
+ eventjs.add(conf.target, "mouseup", conf.onPointerUp);
+ }
+ };
+ conf.onPointerUp = function(event) {
+ if (root.pointerEnd(event, self, conf)) {
+ eventjs.remove(conf.target, "mouseup", conf.onPointerUp);
+ var pointers = event.changedTouches || root.getCoords(event);
+ var pointer = pointers[0];
+ var bbox = conf.bbox;
+ var newbbox = root.getBoundingBox(conf.target);
+ var y = pointer.pageY - newbbox.scrollBodyTop;
+ var x = pointer.pageX - newbbox.scrollBodyLeft;
+ ////
+ if (x > bbox.x1 && y > bbox.y1 &&
+ x < bbox.x2 && y < bbox.y2 &&
+ bbox.scrollTop === newbbox.scrollTop) { // has not been scrolled
+ ///
+ for (var key in conf.tracker) break; //- should be modularized? in dblclick too
+ var point = conf.tracker[key];
+ self.x = point.start.x;
+ self.y = point.start.y;
+ ///
+ conf.listener(event, self);
+ }
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ self.state = "click";
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.click = root.click;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Double-Click" aka "Double-Tap" event proxy.
+ ----------------------------------------------------
+ eventjs.add(window, "dblclick", function(event, self) {});
+ ----------------------------------------------------
+ Touch an target twice for <= 700ms, with less than 25 pixel drift.
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.dbltap =
+root.dblclick = function(conf) {
+ conf.gesture = conf.gesture || "dbltap";
+ conf.maxFingers = conf.maxFingers || conf.fingers || 1;
+ // Setting up local variables.
+ var delay = 700; // in milliseconds
+ var time0, time1, timeout;
+ var pointer0, pointer1;
+ // Tracking the events.
+ conf.onPointerDown = function (event) {
+ var pointers = event.changedTouches || root.getCoords(event);
+ if (time0 && !time1) { // Click #2
+ pointer1 = pointers[0];
+ time1 = (new Date()).getTime() - time0;
+ } else { // Click #1
+ pointer0 = pointers[0];
+ time0 = (new Date()).getTime();
+ time1 = 0;
+ clearTimeout(timeout);
+ timeout = setTimeout(function() {
+ time0 = 0;
+ }, delay);
+ }
+ if (root.pointerStart(event, self, conf)) {
+ eventjs.add(conf.target, "mousemove", conf.onPointerMove).listener(event);
+ eventjs.add(conf.target, "mouseup", conf.onPointerUp);
+ }
+ };
+ conf.onPointerMove = function (event) {
+ if (time0 && !time1) {
+ var pointers = event.changedTouches || root.getCoords(event);
+ pointer1 = pointers[0];
+ }
+ var bbox = conf.bbox;
+ var ax = (pointer1.pageX - bbox.x1);
+ var ay = (pointer1.pageY - bbox.y1);
+ if (!(ax > 0 && ax < bbox.width && // Within target coordinates..
+ ay > 0 && ay < bbox.height &&
+ Math.abs(pointer1.pageX - pointer0.pageX) <= 25 && // Within drift deviance.
+ Math.abs(pointer1.pageY - pointer0.pageY) <= 25)) {
+ // Cancel out this listener.
+ eventjs.remove(conf.target, "mousemove", conf.onPointerMove);
+ clearTimeout(timeout);
+ time0 = time1 = 0;
+ }
+ };
+ conf.onPointerUp = function(event) {
+ if (root.pointerEnd(event, self, conf)) {
+ eventjs.remove(conf.target, "mousemove", conf.onPointerMove);
+ eventjs.remove(conf.target, "mouseup", conf.onPointerUp);
+ }
+ if (time0 && time1) {
+ if (time1 <= delay) { // && !(event.cancelBubble && ++event.cancelBubbleCount > 1)) {
+ self.state = conf.gesture;
+ for (var key in conf.tracker) break;
+ var point = conf.tracker[key];
+ self.x = point.start.x;
+ self.y = point.start.y;
+ conf.listener(event, self);
+ }
+ clearTimeout(timeout);
+ time0 = time1 = 0;
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ self.state = "dblclick";
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.dbltap = root.dbltap;
+eventjs.Gesture._gestureHandlers.dblclick = root.dblclick;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Drag" event proxy (1+ fingers).
+ ----------------------------------------------------
+ CONFIGURE: maxFingers, position.
+ ----------------------------------------------------
+ eventjs.add(window, "drag", function(event, self) {
+ console.log(self.gesture, self.state, self.start, self.x, self.y, self.bbox);
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.dragElement = function(that, event) {
+ root.drag({
+ event: event,
+ target: that,
+ position: "move",
+ listener: function(event, self) {
+ that.style.left = self.x + "px";
+ that.style.top = self.y + "px";
+ eventjs.prevent(event);
+ }
+ });
+};
+
+root.drag = function(conf) {
+ conf.gesture = "drag";
+ conf.onPointerDown = function (event) {
+ if (root.pointerStart(event, self, conf)) {
+ if (!conf.monitor) {
+ eventjs.add(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ }
+ // Process event listener.
+ conf.onPointerMove(event, "down");
+ };
+ conf.onPointerMove = function (event, state) {
+ if (!conf.tracker) return conf.onPointerDown(event);
+//alertify.log('move')
+ var bbox = conf.bbox;
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var identifier = touch.identifier || Infinity;
+ var pt = conf.tracker[identifier];
+ // Identifier defined outside of listener.
+ if (!pt) continue;
+ pt.pageX = touch.pageX;
+ pt.pageY = touch.pageY;
+ // Record data.
+ self.state = state || "move";
+ self.identifier = identifier;
+ self.start = pt.start;
+ self.fingers = conf.fingers;
+ if (conf.position === "differenceFromLast") {
+ self.x = (pt.pageX - pt.offsetX);
+ self.y = (pt.pageY - pt.offsetY);
+ pt.offsetX = pt.pageX;
+ pt.offsetY = pt.pageY;
+ } else {
+ self.x = (pt.pageX - pt.offsetX);
+ self.y = (pt.pageY - pt.offsetY);
+ }
+ ///
+ conf.listener(event, self);
+ }
+ };
+ conf.onPointerUp = function(event) {
+ // Remove tracking for touch.
+ if (root.pointerEnd(event, self, conf, conf.onPointerMove)) {
+ if (!conf.monitor) {
+ eventjs.remove(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.remove(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ // Attach events.
+ if (conf.event) {
+ conf.onPointerDown(conf.event);
+ } else { //
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ if (conf.monitor) {
+ eventjs.add(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ }
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.drag = root.drag;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Gesture" event proxy (2+ fingers).
+ ----------------------------------------------------
+ CONFIGURE: minFingers, maxFingers.
+ ----------------------------------------------------
+ eventjs.add(window, "gesture", function(event, self) {
+ console.log(
+ self.x, // centroid
+ self.y,
+ self.rotation,
+ self.scale,
+ self.fingers,
+ self.state
+ );
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+var RAD_DEG = Math.PI / 180;
+var getCentroid = function(self, points) {
+ var centroidx = 0;
+ var centroidy = 0;
+ var length = 0;
+ for (var sid in points) {
+ var touch = points[sid];
+ if (touch.up) continue;
+ centroidx += touch.move.x;
+ centroidy += touch.move.y;
+ length ++;
+ }
+ self.x = centroidx /= length;
+ self.y = centroidy /= length;
+ return self;
+};
+
+root.gesture = function(conf) {
+ conf.gesture = conf.gesture || "gesture";
+ conf.minFingers = conf.minFingers || conf.fingers || 2;
+ // Tracking the events.
+ conf.onPointerDown = function (event) {
+ var fingers = conf.fingers;
+ if (root.pointerStart(event, self, conf)) {
+ eventjs.add(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ // Record gesture start.
+ if (conf.fingers === conf.minFingers && fingers !== conf.fingers) {
+ self.fingers = conf.minFingers;
+ self.scale = 1;
+ self.rotation = 0;
+ self.state = "start";
+ var sids = ""; //- FIXME(mud): can generate duplicate IDs.
+ for (var key in conf.tracker) sids += key;
+ self.identifier = parseInt(sids);
+ getCentroid(self, conf.tracker);
+ conf.listener(event, self);
+ }
+ };
+ ///
+ conf.onPointerMove = function (event, state) {
+ var bbox = conf.bbox;
+ var points = conf.tracker;
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ // Update tracker coordinates.
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var sid = touch.identifier || Infinity;
+ var pt = points[sid];
+ // Check whether "pt" is used by another gesture.
+ if (!pt) continue;
+ // Find the actual coordinates.
+ pt.move.x = (touch.pageX - bbox.x1);
+ pt.move.y = (touch.pageY - bbox.y1);
+ }
+ ///
+ if (conf.fingers < conf.minFingers) return;
+ ///
+ var touches = [];
+ var scale = 0;
+ var rotation = 0;
+
+ /// Calculate centroid of gesture.
+ getCentroid(self, points);
+ ///
+ for (var sid in points) {
+ var touch = points[sid];
+ if (touch.up) continue;
+ var start = touch.start;
+ if (!start.distance) {
+ var dx = start.x - self.x;
+ var dy = start.y - self.y;
+ start.distance = Math.sqrt(dx * dx + dy * dy);
+ start.angle = Math.atan2(dx, dy) / RAD_DEG;
+ }
+ // Calculate scale.
+ var dx = touch.move.x - self.x;
+ var dy = touch.move.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ scale += distance / start.distance;
+ // Calculate rotation.
+ var angle = Math.atan2(dx, dy) / RAD_DEG;
+ var rotate = (start.angle - angle + 360) % 360 - 180;
+ touch.DEG2 = touch.DEG1; // Previous degree.
+ touch.DEG1 = rotate > 0 ? rotate : -rotate; // Current degree.
+ if (typeof(touch.DEG2) !== "undefined") {
+ if (rotate > 0) {
+ touch.rotation += touch.DEG1 - touch.DEG2;
+ } else {
+ touch.rotation -= touch.DEG1 - touch.DEG2;
+ }
+ rotation += touch.rotation;
+ }
+ // Attach current points to self.
+ touches.push(touch.move);
+ }
+ ///
+ self.touches = touches;
+ self.fingers = conf.fingers;
+ self.scale = scale / conf.fingers;
+ self.rotation = rotation / conf.fingers;
+ self.state = "change";
+ conf.listener(event, self);
+ };
+ conf.onPointerUp = function(event) {
+ // Remove tracking for touch.
+ var fingers = conf.fingers;
+ if (root.pointerEnd(event, self, conf)) {
+ eventjs.remove(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.remove(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ // Check whether fingers has dropped below minFingers.
+ if (fingers === conf.minFingers && conf.fingers < conf.minFingers) {
+ self.fingers = conf.fingers;
+ self.state = "end";
+ conf.listener(event, self);
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.gesture = root.gesture;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Pointer" event proxy (1+ fingers).
+ ----------------------------------------------------
+ CONFIGURE: minFingers, maxFingers.
+ ----------------------------------------------------
+ eventjs.add(window, "gesture", function(event, self) {
+ console.log(self.rotation, self.scale, self.fingers, self.state);
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.pointerdown =
+root.pointermove =
+root.pointerup = function(conf) {
+ conf.gesture = conf.gesture || "pointer";
+ if (conf.target.isPointerEmitter) return;
+ // Tracking the events.
+ var isDown = true;
+ conf.onPointerDown = function (event) {
+ isDown = false;
+ self.gesture = "pointerdown";
+ conf.listener(event, self);
+ };
+ conf.onPointerMove = function (event) {
+ self.gesture = "pointermove";
+ conf.listener(event, self, isDown);
+ };
+ conf.onPointerUp = function (event) {
+ isDown = true;
+ self.gesture = "pointerup";
+ conf.listener(event, self, true);
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ eventjs.add(conf.target, "mousemove", conf.onPointerMove);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ // Return this object.
+ conf.target.isPointerEmitter = true;
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.pointerdown = root.pointerdown;
+eventjs.Gesture._gestureHandlers.pointermove = root.pointermove;
+eventjs.Gesture._gestureHandlers.pointerup = root.pointerup;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Device Motion" and "Shake" event proxy.
+ ----------------------------------------------------
+ http://developer.android.com/reference/android/hardware/Sensoreventjs.html#values
+ ----------------------------------------------------
+ eventjs.add(window, "shake", function(event, self) {});
+ eventjs.add(window, "devicemotion", function(event, self) {
+ console.log(self.acceleration, self.accelerationIncludingGravity);
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.shake = function(conf) {
+ // Externally accessible data.
+ var self = {
+ gesture: "devicemotion",
+ acceleration: {},
+ accelerationIncludingGravity: {},
+ target: conf.target,
+ listener: conf.listener,
+ remove: function() {
+ window.removeEventListener('devicemotion', onDeviceMotion, false);
+ }
+ };
+ // Setting up local variables.
+ var threshold = 4; // Gravitational threshold.
+ var timeout = 1000; // Timeout between shake events.
+ var timeframe = 200; // Time between shakes.
+ var shakes = 3; // Minimum shakes to trigger event.
+ var lastShake = (new Date()).getTime();
+ var gravity = { x: 0, y: 0, z: 0 };
+ var delta = {
+ x: { count: 0, value: 0 },
+ y: { count: 0, value: 0 },
+ z: { count: 0, value: 0 }
+ };
+ // Tracking the events.
+ var onDeviceMotion = function(e) {
+ var alpha = 0.8; // Low pass filter.
+ var o = e.accelerationIncludingGravity;
+ gravity.x = alpha * gravity.x + (1 - alpha) * o.x;
+ gravity.y = alpha * gravity.y + (1 - alpha) * o.y;
+ gravity.z = alpha * gravity.z + (1 - alpha) * o.z;
+ self.accelerationIncludingGravity = gravity;
+ self.acceleration.x = o.x - gravity.x;
+ self.acceleration.y = o.y - gravity.y;
+ self.acceleration.z = o.z - gravity.z;
+ ///
+ if (conf.gesture === "devicemotion") {
+ conf.listener(e, self);
+ return;
+ }
+ var data = "xyz";
+ var now = (new Date()).getTime();
+ for (var n = 0, length = data.length; n < length; n ++) {
+ var letter = data[n];
+ var ACCELERATION = self.acceleration[letter];
+ var DELTA = delta[letter];
+ var abs = Math.abs(ACCELERATION);
+ /// Check whether another shake event was recently registered.
+ if (now - lastShake < timeout) continue;
+ /// Check whether delta surpasses threshold.
+ if (abs > threshold) {
+ var idx = now * ACCELERATION / abs;
+ var span = Math.abs(idx + DELTA.value);
+ // Check whether last delta was registered within timeframe.
+ if (DELTA.value && span < timeframe) {
+ DELTA.value = idx;
+ DELTA.count ++;
+ // Check whether delta count has enough shakes.
+ if (DELTA.count === shakes) {
+ conf.listener(e, self);
+ // Reset tracking.
+ lastShake = now;
+ DELTA.value = 0;
+ DELTA.count = 0;
+ }
+ } else {
+ // Track first shake.
+ DELTA.value = idx;
+ DELTA.count = 1;
+ }
+ }
+ }
+ };
+ // Attach events.
+ if (!window.addEventListener) return;
+ window.addEventListener('devicemotion', onDeviceMotion, false);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.shake = root.shake;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Swipe" event proxy (1+ fingers).
+ ----------------------------------------------------
+ CONFIGURE: snap, threshold, maxFingers.
+ ----------------------------------------------------
+ eventjs.add(window, "swipe", function(event, self) {
+ console.log(self.velocity, self.angle);
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+var RAD_DEG = Math.PI / 180;
+
+root.swipe = function(conf) {
+ conf.snap = conf.snap || 90; // angle snap.
+ conf.threshold = conf.threshold || 1; // velocity threshold.
+ conf.gesture = conf.gesture || "swipe";
+ // Tracking the events.
+ conf.onPointerDown = function (event) {
+ if (root.pointerStart(event, self, conf)) {
+ eventjs.add(conf.doc, "mousemove", conf.onPointerMove).listener(event);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ }
+ };
+ conf.onPointerMove = function (event) {
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var sid = touch.identifier || Infinity;
+ var o = conf.tracker[sid];
+ // Identifier defined outside of listener.
+ if (!o) continue;
+ o.move.x = touch.pageX;
+ o.move.y = touch.pageY;
+ o.moveTime = (new Date()).getTime();
+ }
+ };
+ conf.onPointerUp = function(event) {
+ if (root.pointerEnd(event, self, conf)) {
+ eventjs.remove(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.remove(conf.doc, "mouseup", conf.onPointerUp);
+ ///
+ var velocity1;
+ var velocity2
+ var degree1;
+ var degree2;
+ /// Calculate centroid of gesture.
+ var start = { x: 0, y: 0 };
+ var endx = 0;
+ var endy = 0;
+ var length = 0;
+ ///
+ for (var sid in conf.tracker) {
+ var touch = conf.tracker[sid];
+ var xdist = touch.move.x - touch.start.x;
+ var ydist = touch.move.y - touch.start.y;
+ ///
+ endx += touch.move.x;
+ endy += touch.move.y;
+ start.x += touch.start.x;
+ start.y += touch.start.y;
+ length ++;
+ ///
+ var distance = Math.sqrt(xdist * xdist + ydist * ydist);
+ var ms = touch.moveTime - touch.startTime;
+ var degree2 = Math.atan2(xdist, ydist) / RAD_DEG + 180;
+ var velocity2 = ms ? distance / ms : 0;
+ if (typeof(degree1) === "undefined") {
+ degree1 = degree2;
+ velocity1 = velocity2;
+ } else if (Math.abs(degree2 - degree1) <= 20) {
+ degree1 = (degree1 + degree2) / 2;
+ velocity1 = (velocity1 + velocity2) / 2;
+ } else {
+ return;
+ }
+ }
+ ///
+ var fingers = conf.gestureFingers;
+ if (conf.minFingers <= fingers && conf.maxFingers >= fingers) {
+ if (velocity1 > conf.threshold) {
+ start.x /= length;
+ start.y /= length;
+ self.start = start;
+ self.x = endx / length;
+ self.y = endy / length;
+ self.angle = -((((degree1 / conf.snap + 0.5) >> 0) * conf.snap || 360) - 360);
+ self.velocity = velocity1;
+ self.fingers = fingers;
+ self.state = "swipe";
+ conf.listener(event, self);
+ }
+ }
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.swipe = root.swipe;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Tap" and "Longpress" event proxy.
+ ----------------------------------------------------
+ CONFIGURE: delay (longpress), timeout (tap).
+ ----------------------------------------------------
+ eventjs.add(window, "tap", function(event, self) {
+ console.log(self.fingers);
+ });
+ ----------------------------------------------------
+ multi-finger tap // touch an target for <= 250ms.
+ multi-finger longpress // touch an target for >= 500ms
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.longpress = function(conf) {
+ conf.gesture = "longpress";
+ return root.tap(conf);
+};
+
+root.tap = function(conf) {
+ conf.delay = conf.delay || 500;
+ conf.timeout = conf.timeout || 250;
+ conf.driftDeviance = conf.driftDeviance || 10;
+ conf.gesture = conf.gesture || "tap";
+ // Setting up local variables.
+ var timestamp, timeout;
+ // Tracking the events.
+ conf.onPointerDown = function (event) {
+ if (root.pointerStart(event, self, conf)) {
+ timestamp = (new Date()).getTime();
+ // Initialize event listeners.
+ eventjs.add(conf.doc, "mousemove", conf.onPointerMove).listener(event);
+ eventjs.add(conf.doc, "mouseup", conf.onPointerUp);
+ // Make sure this is a "longpress" event.
+ if (conf.gesture !== "longpress") return;
+ timeout = setTimeout(function() {
+ if (event.cancelBubble && ++event.cancelBubbleCount > 1) return;
+ // Make sure no fingers have been changed.
+ var fingers = 0;
+ for (var key in conf.tracker) {
+ var point = conf.tracker[key];
+ if (point.end === true) return;
+ if (conf.cancel) return;
+ fingers ++;
+ }
+ // Send callback.
+ if (conf.minFingers <= fingers && conf.maxFingers >= fingers) {
+ self.state = "start";
+ self.fingers = fingers;
+ self.x = point.start.x;
+ self.y = point.start.y;
+ conf.listener(event, self);
+ }
+ }, conf.delay);
+ }
+ };
+ conf.onPointerMove = function (event) {
+ var bbox = conf.bbox;
+ var touches = event.changedTouches || root.getCoords(event);
+ var length = touches.length;
+ for (var i = 0; i < length; i ++) {
+ var touch = touches[i];
+ var identifier = touch.identifier || Infinity;
+ var pt = conf.tracker[identifier];
+ if (!pt) continue;
+ var x = (touch.pageX - bbox.x1);
+ var y = (touch.pageY - bbox.y1);
+ ///
+ var dx = x - pt.start.x;
+ var dy = y - pt.start.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (!(x > 0 && x < bbox.width && // Within target coordinates..
+ y > 0 && y < bbox.height &&
+ distance <= conf.driftDeviance)) { // Within drift deviance.
+ // Cancel out this listener.
+ eventjs.remove(conf.doc, "mousemove", conf.onPointerMove);
+ conf.cancel = true;
+ return;
+ }
+ }
+ };
+ conf.onPointerUp = function(event) {
+ if (root.pointerEnd(event, self, conf)) {
+ clearTimeout(timeout);
+ eventjs.remove(conf.doc, "mousemove", conf.onPointerMove);
+ eventjs.remove(conf.doc, "mouseup", conf.onPointerUp);
+ if (event.cancelBubble && ++event.cancelBubbleCount > 1) return;
+ // Callback release on longpress.
+ if (conf.gesture === "longpress") {
+ if (self.state === "start") {
+ self.state = "end";
+ conf.listener(event, self);
+ }
+ return;
+ }
+ // Cancel event due to movement.
+ if (conf.cancel) return;
+ // Ensure delay is within margins.
+ if ((new Date()).getTime() - timestamp > conf.timeout) return;
+ // Send callback.
+ var fingers = conf.gestureFingers;
+ if (conf.minFingers <= fingers && conf.maxFingers >= fingers) {
+ self.state = "tap";
+ self.fingers = conf.gestureFingers;
+ conf.listener(event, self);
+ }
+ }
+ };
+ // Generate maintenance commands, and other configurations.
+ var self = root.pointerSetup(conf);
+ // Attach events.
+ eventjs.add(conf.target, "mousedown", conf.onPointerDown);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.tap = root.tap;
+eventjs.Gesture._gestureHandlers.longpress = root.longpress;
+
+return root;
+
+})(eventjs.proxy);
+/*:
+ "Mouse Wheel" event proxy.
+ ----------------------------------------------------
+ eventjs.add(window, "wheel", function(event, self) {
+ console.log(self.state, self.wheelDelta);
+ });
+*/
+
+if (typeof(eventjs) === "undefined") var eventjs = {};
+if (typeof(eventjs.proxy) === "undefined") eventjs.proxy = {};
+
+eventjs.proxy = (function(root) { "use strict";
+
+root.wheelPreventElasticBounce = function(el) {
+ if (!el) return;
+ if (typeof(el) === "string") el = document.querySelector(el);
+ eventjs.add(el, "wheel", function(event, self) {
+ self.preventElasticBounce();
+ eventjs.stop(event);
+ });
+};
+
+root.wheel = function(conf) {
+ // Configure event listener.
+ var interval;
+ var timeout = conf.timeout || 150;
+ var count = 0;
+ // Externally accessible data.
+ var self = {
+ gesture: "wheel",
+ state: "start",
+ wheelDelta: 0,
+ target: conf.target,
+ listener: conf.listener,
+ preventElasticBounce: function(event) {
+ var target = this.target;
+ var scrollTop = target.scrollTop;
+ var top = scrollTop + target.offsetHeight;
+ var height = target.scrollHeight;
+ if (top === height && this.wheelDelta <= 0) eventjs.cancel(event);
+ else if (scrollTop === 0 && this.wheelDelta >= 0) eventjs.cancel(event);
+ eventjs.stop(event);
+ },
+ add: function() {
+ conf.target[add](type, onMouseWheel, false);
+ },
+ remove: function() {
+ conf.target[remove](type, onMouseWheel, false);
+ }
+ };
+ // Tracking the events.
+ var onMouseWheel = function(event) {
+ event = event || window.event;
+ self.state = count++ ? "change" : "start";
+ self.wheelDelta = event.detail ? event.detail * -20 : event.wheelDelta;
+ conf.listener(event, self);
+ clearTimeout(interval);
+ interval = setTimeout(function() {
+ count = 0;
+ self.state = "end";
+ self.wheelDelta = 0;
+ conf.listener(event, self);
+ }, timeout);
+ };
+ // Attach events.
+ var add = document.addEventListener ? "addEventListener" : "attachEvent";
+ var remove = document.removeEventListener ? "removeEventListener" : "detachEvent";
+ var type = eventjs.getEventSupport("mousewheel") ? "mousewheel" : "DOMMouseScroll";
+ conf.target[add](type, onMouseWheel, false);
+ // Return this object.
+ return self;
+};
+
+eventjs.Gesture = eventjs.Gesture || {};
+eventjs.Gesture._gestureHandlers = eventjs.Gesture._gestureHandlers || {};
+eventjs.Gesture._gestureHandlers.wheel = root.wheel;
+
+return root;
+
+})(eventjs.proxy);
+
+///
+var addEvent = eventjs.add;
+var removeEvent = eventjs.remove;
+///
+(function() {
+ for (var key in eventjs) {
+ Event[key] = eventjs[key];
+ }
+ for (var key in eventjs.proxy) {
+ addEvent[key] = eventjs.proxy[key];
+ }
+})(); \ No newline at end of file
diff --git a/Processing-js/libs/js/Window/Queue.js b/Processing-js/libs/js/Window/Queue.js
new file mode 100644
index 0000000..890b61b
--- /dev/null
+++ b/Processing-js/libs/js/Window/Queue.js
@@ -0,0 +1,87 @@
+/*
+ ----------------------------------------
+ window.Queue : 0.1.1 : http://mudcu.be
+ ----------------------------------------
+ var queue = new Queue({
+ items: list,
+ oncomplete: function() {
+ queue.reset(); // infinite loop!
+ queue.next();
+ },
+ next: function(item) {
+ if (item[0] !== "." && item.indexOf(".") === -1) {
+ readDir(dir + item + "/", queue.next);
+ } else {
+ setTimeout(queue.next, 1)
+ }
+ }
+ });
+*/
+
+if (typeof(window) === "undefined") window = {};
+
+window.Queue = function(conf) {
+ var that = this;
+ /// Request the next item in stack.
+ this.next = function() {
+ var arr = that.queue;
+ /// Emit the progress of the queue.
+ if (conf.onprogress) {
+ conf.onprogress(that.length ? 1 - that.remaining / that.length : 1);
+ }
+ /// Check whether the queue is complete.
+ if (!arr.length) {
+ if (conf.oncomplete) {
+ conf.oncomplete();
+ }
+ return;
+ }
+ /// Indicate previous element as processed.
+ that.remaining --;
+ /// Cleanup previous completed dimension.
+
+ if (String(arr[0]) === "[object Object]" && !arr[0].length) {
+ arr.shift();
+ }
+ /// Process next item in multi-dimensional stack.
+ if (String(arr[0]) === "[object Object]" && arr[0].length) {
+ conf.next(arr[0].shift());
+ } else { // ditto for single-dimensional stack.
+ conf.next(arr.shift());
+ }
+ };
+ ///
+ this.reset = function(items) {
+ items = items || conf.items;
+ this.length = 0;
+ this.remaining = -1;
+ this.queue = [];
+ /// Flatten multi-dimensional objects.
+ for (var key in items) {
+ if (String(items[key]) === "[object Object]") {
+ var sub = [];
+ this.queue.push(sub);
+ for (var id in items[key]) {
+ sub.push(items[key][id]);
+ this.length ++;
+ this.remaining ++;
+ }
+ } else {
+ this.queue.push(items[key]);
+ this.length ++;
+ this.remaining ++;
+ }
+ }
+ };
+ ///
+ this.reset();
+ /// Escape event loop.
+ setTimeout(this.next, 1);
+ ///
+ return this;
+};
+
+/// For NodeJS
+if (typeof (module) !== "undefined" && module.exports) {
+ module.exports = window.Queue;
+} \ No newline at end of file
diff --git a/Processing-js/libs/soundfont/acoustic_grand_piano-mp3.js b/Processing-js/libs/soundfont/acoustic_grand_piano-mp3.js
new file mode 100644
index 0000000..0253034
--- /dev/null
+++ b/Processing-js/libs/soundfont/acoustic_grand_piano-mp3.js
@@ -0,0 +1,93 @@
+if (typeof(MIDI) === "undefined") var MIDI = {};
+if (typeof(MIDI.Soundfont) === "undefined") MIDI.Soundfont = {};
+MIDI.Soundfont.acoustic_grand_piano = {
+"A0": "data:audio/mpeg;base64,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Mw0KCQICYnM3X3B+ukyVjw3/+xBEmo/wjwlUgekoSg9BKjA9JwlCCBlWBjEiaDkEqUDEiFTxMSICQTIxNt7jProHwkEZbUKS5AgUalEwU1raJmchG0+Ki4IQYalBYUWofATbEIbLNkYTQkbrDQ1pR1BNWYi9CfTj/f/7EEScj/CHCVSBiRC6DkEqQDDFFwH0JVIHpGEgOQTpAPMIXEmp4VxWqooO5RjcdQqPQsI2zU3jeWmP2icKtpRp1PSYIty7mL549i8QS4Mlyu5JSrDhRYewoaK0hIESg8afYKAUIQx9//sQRKAP8JEJ1QHpMJoPYTpAMGVDAgglUgekQSA9BKjA9JQkQ1tFKkkzK/R7rSTVT8Ll4qCdVCSzOJk0DbOHRMu+3iqCtASEoMQ4HYtrTZYfNnkqQbtIAAsMQ4HY3WlowPkxnmOLUhD/+xBEoY/wjAbUgeZgmA7hGjA9IxdCBB9UB7Bg4D8EqMD0jFSF6xqQeQjInMhROrPcq9s2HRbWEMYiBg8kHbq4k42bDbTQ8MAWRyAUo5iHhXEGvuqO9NMy8J22BaKiPCuYjooQTMMgSP/7EESjD/CICVUBhhBAEAE6MDEnJQIcGVQHpSJoPoSpAPSMVHg0RD7J5deh4YQpywlMyiDZIKJBxqnvHwwyqygL4hJECF4XNWQNSC8GdxxQIh6pDCryMTRCNCHw900sYxTIDgRaXbDJ//sQRKQP8IAI1QGJEEoOwSowPSUJAfAjVAYkQShBBKiAxhhUaEswQdw43iThj91bZrklQgbi7aYCNcGlWQ/DjaiRwl9iQwKyRJJdIEmTiTngqILQfl9aeGn4aO4tAD0zqUaLgAmVKy3/+xBEpo/whwlVAewwGA8BOjA8wSkCKCVSBjBBIDoE6QCTFJRi/oDJJiHKOoIcVww15SmQoVLKbzIYapkCn18pGYaS02Lv88AAVCopJUOBQS78grIKttoAAFCgIL4VTEFNRTMuOTlVVf/7EESoj/CGCVUB5hIIDmEqQD0iCQIQI1QGMEEgQASowJYYHFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQRKqP8IcI1IGGSAgPIRpAMMYBAiQjUgekwKg5hKkA9JhEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBErI/wiAlVAYkQuA8BKkAwwxUB/CNUB6RhIDsEqQD0jFRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EESvAACzCdQFPCAKFOE6IKeEAQSoM0gZhAAAeIZoAx5gAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQRJmP8IADTMckwAoI4Dp04YABwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"A1": "data:audio/mpeg;base64,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",
+"A2": "data:audio/mpeg;base64,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",
+"A3": "data:audio/mpeg;base64,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",
+"A4": "data:audio/mpeg;base64,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",
+"A5": "data:audio/mpeg;base64,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AAAAIJv4xF6gANEB9hLQAPD/+xBk7AMwngxUckBLGA0gys4AMCECYDNNyQEsYC2DKzgQQAzfAPAAAAXwCL/R4BwTwB4DRHryH9YWEldo2PSASDyAV9J4AJ3kOxXwDdngDgAAABbB48wetQWCJxcDjwDw/wDwAAAG1//7EGTuAzCcDFTyADMYDoDKvgQQAwIgMU/GgMxgL4MpOBA8xNYBmn6vAOC/APAZgi/l9s6AipNqWYjDgDg/gDQMHg3ATQ56VUxBTUVVVeAOCvAOAAAAJAveaPqBrDJdAY8AAPAA0AAA//sQZPCDsJIMVHIgSxgLwMreBA8HAjQxS8aA7GAcAyr4EDwcCHYwv6eANCMAN8VoMHzZtYNaiqMBHv8AANAA8Dag0fJq0A3r8A0AAAA0f0aZcWBgDUMAh/BL4dvv/B4AAACoZ/6ar2P/+xBk9wNw8wxOeaBLGA6Ayr4EDzECFDFPxoDMYCODazgQNAxQZKAewxGTV9+BgnfMnOntrLgKgAcDgcAAAAACKXIr2miO2PNDMDDUeBgkrUSMaIz4YVWkwMmecO/+ZyJqPhQC/JBR///7EGT1gTCmDFPyAEsYE4DJnQQQAwKYMT/ogSxgL4MquBBADCpIc/HnYjJjIeIgHgfjUDAUCgB+IMh2+15gMbATtUZidpKEMUjJwsLA2Fm4OWoZUB4RxzHojdMmhYbBqOJFmZm7+cJR//sQZPMDMJQMU/GgMxgOQOquBA0DAgwxT8aBLGArA2q4EDQMWQTGZmZc338SxLmo+AGvBUBB3+CoCDrv8qZDo1P/2DUsG0xBTUUzLjk5VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBE9wMwegbT8SBQGBHBip40A2MByDFRyABsYEKGKjigJYxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGT5AzCcDNRxoEsYDGDK7gAKAwIYMU/IASxgLoMoeBAoDFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZPyDMJwMU/IAMxgOANrOBBADAkgxT8mBbGAyAyp4EGDEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBk+wMwlAxUciBDGAxAyr4EGAcCODFJyIEsYCeDK3gQNBxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EET/gACnDFP1NEAIGiGafqecAQdoQ0f5owBBio8ofzTASFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQRLsP8AAAf4cAAAgAAA/w4AABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"A6": "data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVX/+xBk7QHwgQxReOBAeAAAD/AAAAEB1DE544BBYAAAP8AAAARVVVVVVVVVoAAAAAsAAOAAAyDFf//+jAAAAI4WM///9KpMQU1FMy45Oaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EGTqh/B9DFF44Eh4AAAP8AAAAQFAMUXDgSHgAAA/wAAABKqqqqqqqqqqoAAAAAsAAOAAAyga///8rYAAAGIK///+qkxBTUUzLjk5qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZPGB8IQMUXjgSHgKYAoOAAABAZgxO+KBYeAAAD/AAAAEqqqqgAAAAAkAOKAAASgf/6kf+uwAAAACwAA4dLHf//+iTEFNRTMuOTmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk6wHwZwDQcOAACAAAD/AAAAEBtDFF44Eh4AAAP8AAAASqqqqqqqqwAAAADQAA4AADpUSN///6QALAJTcIX///8rVMQU1FMy45OVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGTtgfCBDFH4oEh4AAAP8AAAAQHsMT/igEEgAAA/wAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk5VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZOyB8H0MUPigQHgAAA/wAAABAbQxOeOBIeAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBk6gvwfwxReSAQeAAAD/AAAAEBJDFFw4Fh4AAAP8AAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGTqh/B8DFD4oBB4AAAP8AAAAQE0MUPEgMHgAAA/wAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZOoH8H0MUPigQHgAAA/wAAABARwxRcOAYeAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBk7IHwggxO+KA4eAAAD/AAAAEBsDFF44DB4AAAP8AAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGTrC/CCDFF44Eh4AAAP8AAAAQFEMUHDAQHgAAA/wAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZN2P8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"A7": "data:audio/mpeg;base64,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",
+"Ab1": "data:audio/mpeg;base64,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",
+"Ab2": "data:audio/mpeg;base64,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S6y6w98LVBbE/fu4GDfjh1v/+xBERI/wcQrUAG8Qmg+hakAN4hIB7C1QBghmwDsFqUDBDNgCXXAfC1QWynrn3CYW/HhdDNfoMI0hgTFqvqcML3u60J5xUo9E0YGC1/qdAXvd1xPfVXIQBlYxrjbH2Agb6xaR6PRqyv/7EGRIj/CGDNOBhRooD0GaECQDYQIoK04HpKKANYPogJAVBSGGCdJ/XYUDf3PbeoFZCtXhSGQzOJL3s6lbQagViIleFIZDdxIHvZ1K6yruUNcForRavbfRBb8Ycipnpg10gbGLcV9w//sQREsP8IMNU4GAEgAPgUpACYUEAhArTAYAyCg8BWkAwBkFgNfjh8vNUVDQYloT/9zhYlfdlKsn3nGioYj8Rba+TA192xVm98hgDR1AcjbWwCHH0irM7yHA0dQHI2/ERa/21KzO9Xf/+xBETQ/wgQrTgM8QkA3g+lAwAkFB8CtOAbzCKDqFqQA3mEWJhubiC5b4otfZlokBn0a9cNFZuILt8UWvsy0SAz6F1EyNQZkxdFH9Gzr/9e1ImmlEyQhmYNRX3CwsfjikVx+iYNztPf/7EERQj/CGCtOB5hEwDcFaUBWFBUIEK0wGAMgoPQVpALCYzVLgAMeLgVC0elrgUG52nr3cABj60uu6oEGpHroZfjX+Gir/lwW0C6oE2Wrc27Y2w4UfVgyHIy2TEZGqC9NcFLX2dRr7//sQRFOP8HYK04GBEYoOgVpAMCYzQgwrTgYcxIA/hWkAw5iQojahjJaw8zcBBj0jBbtKx+o1kY+L1IvQ8m/+nJNYR20dvAfCRMcqbcKGj+ECuwQCbY1+L68HNX3bC7s71FBW0O65y8D/+xBEVo/whArTAYJJmg5BakAwojVB8CNQBgRGADcEaUBmCFVxobVI27O6xT4WmhbL++9gY8P+yyibzeyns6Dpg2dvZMIDj6OCa/6Yuw+HDCrcuwEFHpHD3s1S/onjA8Zfh8JGh+3Wev/7EERaj/CECtMAb0iKDkFaQA3iEwHgLVAFgMgoNoVpQCYIFUU7KpKgDKx+Mbkr8xlM//b1EuR6NYpCGC8ufy48w+m/+b1EgMx6NK2djHS5BrMZhbYwuFRLweCQFRkuWvNh68fdAWrE//sQRF6P8IsK04GBSZANAWpQJKM3AdQrTgYAyCg6BWkAtJRNWllYHzHVYCPCRQcjCXqjYJGouJf+ABAJxIYcBjbGqChT5UxBTUUzLjk5VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBEYo/wjgrTAYAyAA7BWlAkAkAB3C1QASRAgD+FaQDAmMhVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGRkj/CKCtOAz0iAEgFaADApQAKIK0oHpMTAPIRnwMEYzVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZGMP8G4ITwBmMAoOQPm1DGMTQAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"Ab3": "data:audio/mpeg;base64,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",
+"Ab4": "data:audio/mpeg;base64,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AAdUAWd3LMN+ywK0Y3+Ye33/+xBkj4MwsAvNQ0A6iAiBGoQIBzWCcC8yoeoCYCqEajhQDUTSL0sL8EG5V9AAThIQABCl4NvHopmkAElBPiSVGKT8FhhXwn/sX3jCgDgDqgApnXQTjWPYQaym/ncOP+pwX1CbxM9AMP/7EGSTCzClC80oWWiYDqEafgXiEQJcLTStGaRgJQRp+FAc1AAWABfinwXfwAO1CPGfszz0me073lM1DHjzev6QAZAAwAAAAA+CjtD9DJVEQ2Jxg4QN7M72Kfs/0B+HG0yAOABYAF+O//sQZJUPMIQIzIB6eIgNoRpOHAZRAfgvMgHoouAlhGn4IBjU+hrdoABG1Lg1O2ez3bMWp9Qbwvu/oAEBHAEAxunwWRVZCAFDPqcQ02t/8n0Y8O1BPEXmRcACQAJ1gb8v3+AAQPArdjr/+xBkmwMwpgvNwFpomA2hGo4IB1ECgCM1A2miYCgEafhQDNTxfreWknIU+gXwj7/6fMTAAAykoGKy6JlGaRrVt1mwmB0w23YKZkFeDeFaBBBRABWFJxatymFVUABiJQtsBkdpy/oXYv/7EGScizCtC80oeji4CqEZ6BwGUYI0LTSh5OLgKIRpuAKIVCJ4kw5/6LAxRAAYpZFyJ8FWxGoqytTLdR4zvsR7y+TfIluXw7qaBaAAoAA/Bl3lquYyhVQBBD5N0x4XhK0P3y1//3+F//sQZKCDMJ0LzkB5WIgKARnkHANRAigvMANo4uAkhGo4IBTUfd/TqKOOALnitwSMXYZ8tcHXWWhTaPLiUqUEQUthnv77IabOQMPmCoa0woBfkgo/6CQ5/9qv/aoyBSEJMHAAAAAAAAD/+xBkpoMwrAvNKHk4uAwhGn4UCTUCgDE3A2hC4CSEabggDNQACDhJh44GlAzRv/9+/+AAAAHkiRIycAgER9EkjooU+L4S7/xVTEFNRTMuOTlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGSpAzCeC80oOii4CMEZ9ADlFQJ4LzUB6KLgJoHp+BEEDFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZK4DMKoLzSh5ELgKgHnoBCcBgnAtNQy8pKAkgylQARgeVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBksYMwqAbNQNl4iAxguaQF5xECZC01DLxEoCcB6ngQJARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGS0AAC3C8uFaEAADMEZ9KOAAQUMM0IZgQAAV4JrewQgSFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZKUP8NIHTO8YAAoAAA/w4AABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"Ab5": "data:audio/mpeg;base64,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zfgH9XBmgDKIa5AVG4dCFMn/+xBk6oMw0AvP+O85OA8g2q4EDwMC3C9NxT1E4DADKrgQGAwHb9A+ANdgAOAAQpAdhQH//////WQ9VcB++KACinpFjfK4WQEssz6/CoAICHBwAAAAvyJyI5/XQLXRQBC6/7QWKjvUAP/7EGTmgzClC9LwTxEoEODKjgQYAwIcL0vEAaBgKYLqeBA0DRuyQJi1KvAN+vDbAAAACUE/wo7UFFVEUDov4dtAN/eDQAAAAr6UKDvZWdXgH/XhwAAiLXpBCrqQDcHgJyD/gr4B294a//sQZOgDMLsL0/FPOTgP4MqeBA8DAkgfUcMB4GAwgyk4EDwMACS2rCBFvOdV8N7X/80AAAASiA/kQjBp1cLDla19D8AeH8AAAAABfmEkIieuAP+vDcAMG+kkMeoaB3DyqouPwg/gH///+xBE5wMwmQtT8C8RKBYhan4VhycB/BtTxIHgYECDajiQMAzBwBLN/YkAiTut4A3n0LsAAAAdF7OEVSlnWE3kNAP/fDwAAAArN/YaCWO9clkMtlgAELzDjZ/5o4HArrccEN+wAiJQMv/7EGTkBzCUC1RwwFAYDqDKrgQLAwGMLVHBAaBgKANq+BAcDGE0y+XmbXZuBFvEo+g4dLzdhxOGVQALzcAAAAAAnCRQUJVVAFXVUAAAAAQzACAkjQLFTEFNRTMuOTlVVVVVVVVVVVVV//sQZOoDMLEL0/CvETgNYNqeBAkDAmQvUcO85KA1Ayp4EDwMVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBk6gMg8AvN+Pg5OA4gyg4EDQMCeC9PxIIAYEoDJnQAvIxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGTig3CQC0ygryk4DeDKDgQPMQGAGU6BgYBwGQMq+ACYjFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQZOsDMK4L1HD4ESgPIMqeBG8xApAtT8U85KA1Ayq4EEAMVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBk6YMwrwvT8WETGA2g2r4EDzECjC9Pwryk4DODKvgQPAxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EGTpATCSBtRxIHgYDyDKvgQPAwN4LzGmPGhgRIPp+DMwxFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQROOP8G0HU/AAMBgPIMpuBAYDQAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"Ab6": "data:audio/mpeg;base64,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VVVVVVWQAAAAgAAHAAAG8H//+xBE9QKwUQtWcEAQaA2Bep4YDRsB5AUrooAAIB4GKnhQKDT//0YAAAB90AAAAOWhnUHzfB3AN+L8N+AAAAH6Ac3ASXVMQU1FMy45OVVVVVVVVVVVVVVVVVVVVVVVVbAAAACQAAcAAP/7EET2BzB7C0/4oBBoDSGKnhgHDQEcLT/BAEGgLAXqeGAobAO8J///0+AAAAG+AAAAGbhQl4AAAAfwDeGYA/gDZoE4kUxBTUUzLjk5VVVVVVVVVVVVVVVVVVXwAAAA7QAAAAzw7cAA//sQRPELMFoA1PDAAAgMwXp+FAoNAJQtWcEAQaAmhar4UBxsAAH8AAAAGzUJY1oAAAAKAABwGeF///9PgAAAB3AGeBp6TEFNRTMuOTmqqqqqqqqqqqqqqqqqqqqqqpAAAACYAAcAAAb/+xBE+IEwfwFP+EAACAwBep4IBw0BuC074QChYDCF6HhQHGT/0P///0eAAAAHeAAAAGeWD/AAAAD9AS/DOAb4CbnCQOpMQU1FMy45Oaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EET0A3B5C0/4QBBoDIF6nhgKDQEUA1nBAAAgH4Xp+GAcNKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqAAAA8AAAAAD6V0xBTUUzLjk5VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQRPKBsFMLVPCgEGgLAWqeGAcNAcAFP+KAACAXhep4YAg0VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBE84GwUwtU8KAQaA0hep4YBxsBwAVB44AAIBiF6rhgFDRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EET0CzB1C0/4QBBoDaF6LiQKCwDUAzvDAAAgJoXqOHAcNFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQRPKDsHcLUHjgEGgLwXqeGAcNAQQvV8EAQaAcBep4YCg0VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xBE9IEwVwvU8KAQaAyhen4YCg0BpC0/4oChoCQF6nhQHDRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EETzA7B9AVB4QAAIC2F6nhQHDQEUL1XBAEGgHYXqeDAUNFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQROKP8AAAf4AAAAgJ4Bn+AAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=",
+"Ab7": "data:audio/mpeg;base64,//uQZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAABwAAAvIQAEBgkLDRASFBkbHSAiJCYpLTAyNDY5Oz1CREZJS01QUlRZW11gYmRmaW1wcnR2eXt9goSGiYuNkJKUmZudoKKkpqmtsLK0trm7vcLExsnLzdDS1Nnb3eDi5Obp7fDy9Pb5+/0AAAA8TEFNRTMuOTkgBK8AAAAALPQAADUgJAUATQABzAAALyG9mNHSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//sQRAAAAAAAUwUAAAgJgApAoAgAAkBxYBgTgABNji3DAnAA/+oMFDn1h8Rh///PoNK6s8yk7mZg24Kk/JWxj//PoNHXVnmKk7mZg21A0X+StjD5kHUOcSFTmi/XTU6PpUlmIkoejor/+xBECo/wqBdVBwWgAhZi6xDgtABCgF1KARWwiFGLqwAithH5kHUOcSFBzRepl00nR9KksxDkhZHRWnUCR5tbokKAgWy2atP6rjgBrOq6coEjzas6JCgIF9mrRf1XHACDOi6VTEHhAf/7EEQCj/CDF1IALQ2AD6LqsAWhsAHMXUgABOGARIuqADCo+F8oHOvC2W9fD8HEcqmIPCArlJ3weH7+oPwUwTyk75WumdJa1b+0wIhe2QcuRnE1ia4BHvp/1aYC8CpqzzN7bT6zeqrX//sQRASP8G4XUgAgUaAQwtpgDCdMAfBbRgAFo8hEC2lAEKz5tahMCtc191HkCpyrRPrnU/6DcGi2mVVy72T7Zmt1W7aRwfg9CoCHBDUrz7AfJ3arZX3ApiCmLkSXvs0YtZ3oznXTbUb/+xBEBw/wiBbRAAEocg8i2lAEKj5CDF1CAIyuQDALaYAQKREIAwrJ8Hy+aJ1cjJtl96AjD8d3OZ/7sUQLKbUEqu/9UCgSnLOFVqj/RK/+hCCY6pSXL+Yy7/at17aQsQN6f//smeRF7//7EEQKj/CIFtCAATjgDGLqUAVCsAHMX0AAgbQAUAtoACC2Sf0+ed/+hQNg/2mXV/TnmjVW7OFYUDdPK87D9v6xYZ2mZ2herekCUD0e93LXYpumRu7CU1QTeS99aggDEbO6MX+fgKvb//sQRAyP8IsWz4BBhCIPovoQBgKwAkBdPgCNrog9C2hAEETYkvfqBoEKO+v7t/dTeCwkPPw1oN72qB