{"id":685,"date":"2017-11-03T10:21:30","date_gmt":"2017-11-03T14:21:30","guid":{"rendered":"http:\/\/seriousplaylab.com\/courses\/edu5855\/?page_id=685"},"modified":"2017-11-03T10:31:20","modified_gmt":"2017-11-03T14:31:20","slug":"twine-sound-macro","status":"publish","type":"page","link":"https:\/\/seriousplaylab.com\/courses\/edu5855\/?page_id=685","title":{"rendered":"Twine Sound Macro"},"content":{"rendered":"<header class=\"entry-header\">\n<h1 class=\"entry-title\">twine (sound)<\/h1>\n<p>&lt;&lt;playsound &#8220;soundfile.mp3&#8221; &gt;&gt; plays the file &#8220;soundfile. mp3&#8221; from the start<br \/>\n&lt;&lt;loopsound $heartbeat &gt;&gt; starts playing $heartbeat, over and over. Note: currently browsers are not that good at looping audio seamlessly &#8211; brief silences between loops may occur.<br \/>\n&lt;&lt;fadeinsound $heartbeat &gt;&gt; is identical to loopsound, but fades in the sound over 2 seconds.<br \/>\n&lt;&lt;unloopsound $heartbeat &gt;&gt; makes $heartbeat no longer repeat when it finishes.<br \/>\n&lt;&lt;stopsound &#8220;birds.ogg&#8221; &gt;&gt; stops playing &#8220;birds.ogg&#8221;. When &lt;&lt;playsound &#8220;birds.ogg&#8221; &gt;&gt; is used again, it will start from the beginning.<br \/>\n&lt;&lt;fadeoutsound &#8220;birds.ogg&#8221; &gt;&gt; is identical to stopsound, but fades out the sound over 2 seconds.<br \/>\n&lt;&lt;pausesound &#8220;trees.ogg&#8221; &gt;&gt; pauses &#8220;trees.ogg&#8221; at its current location. Use &lt;&lt;playsound &#8220;trees.ogg&#8221; &gt;&gt; to resume it.<br \/>\n&lt;&lt;stopallsound&gt;&gt; stops all the sounds.<\/p>\n<p>Make sure that the Macro Passage is the exact filename of your sound file: e.g., soundfile.mp3 or\u00a0 tenori.wav, etc<\/p>\n<\/header>\n<div class=\"entry-content\">\n<pre>(function () {\r\n  \"use strict\";\r\n  version.extensions['soundMacros'] = {\r\n    major: 1,\r\n    minor: 1,\r\n    revision: 2\r\n  };\r\n  var p = macros['playsound'] = {\r\n    soundtracks: {},\r\n    handler: function (a, b, c, d) {\r\n      var loop = function (m) {\r\n          if (m.loop == undefined) {\r\n            m.loopfn = function () {\r\n              this.play();\r\n            };\r\n            m.addEventListener('ended', m.loopfn, 0);\r\n          } else m.loop = true;\r\n          m.play();\r\n          };\r\n      var s = eval(d.fullArgs());\r\n      if (s) {\r\n        s = s.toString();\r\n        var m = this.soundtracks[s.slice(0, s.lastIndexOf(\".\"))];\r\n        if (m) {\r\n          if (b == \"playsound\") {\r\n            m.play();\r\n          } else if (b == \"loopsound\") {\r\n            loop(m);\r\n          } else if (b == \"pausesound\") {\r\n            m.pause();\r\n          } else if (b == \"unloopsound\") {\r\n            if (m.loop != undefined) {\r\n              m.loop = false;\r\n            } else if (m.loopfn) {\r\n              m.removeEventListener('ended', m.loopfn);\r\n              delete m.loopfn;\r\n            }\r\n          } else if (b == \"stopsound\") {\r\n            m.pause();\r\n            m.currentTime = 0;\r\n          } else if (b == \"fadeoutsound\" || b == \"fadeinsound\") {\r\n            if (m.interval) clearInterval(m.interval);\r\n            if (b == \"fadeinsound\") {\r\n              if (m.currentTime&gt;0) return;\r\n              m.volume = 0;\r\n              loop(m);\r\n            } else {\r\n              if (!m.currentTime) return;\r\n              m.play();\r\n            }\r\n            var v = m.volume;\r\n            m.interval = setInterval(function () {\r\n              v = Math.min(1, Math.max(0, v + 0.005 * (b == \"fadeinsound\" ? 1 : -1)));\r\n              m.volume = Math.easeInOut(v);\r\n              if (v == 0 || v == 1) clearInterval(m.interval);\r\n              if (v == 0) {\r\n                m.pause();\r\n                m.currentTime = 0;\r\n                m.volume = 1;\r\n              }\r\n            }, 10);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  macros['fadeinsound'] = p;\r\n  macros['fadeoutsound'] = p;\r\n  macros['unloopsound'] = p;\r\n  macros['loopsound'] = p;\r\n  macros['pausesound'] = p;\r\n  macros['stopsound'] = p;\r\n  macros['stopallsound'] = {\r\n    handler: function () {\r\n      var s = macros.playsound.soundtracks;\r\n      for (var j in s) {\r\n\t\tif (s.hasOwnProperty(j)) {\r\n          s[j].pause();\r\n          if (s[j].currentTime) {\r\n\t\t    s[j].currentTime = 0;\r\n\t\t  }\r\n\t\t}\r\n      }\r\n    }\r\n  }\r\n  var div = document.getElementById(\"storeArea\").firstChild;\r\n  var fe = [\"ogg\", \"mp3\", \"wav\", \"webm\"];\r\n  while (div) {\r\n    var b = String.fromCharCode(92);\r\n    var q = '\"';\r\n    var re = \"['\" + q + \"]([^\" + q + \"']*?)\" + b + \".(ogg|mp3|wav|webm)['\" + q + \"]\";\r\n    k(new RegExp(re, \"gi\"));\r\n    div = div.nextSibling;\r\n  }\r\n\r\n  function k(c, e) {\r\n    do {\r\n      var d = c.exec(div.innerHTML);\r\n      if (d) {\r\n        var a = new Audio();\r\n        if (a.canPlayType) {\r\n          for (var i = -1; i &lt; fe.length; i += 1) {\r\n            if (i &gt;= 0) d[2] = fe[i];\r\n            if (a.canPlayType(\"audio\/\" + d[2])) break;\r\n          }\r\n          if (i &lt; fe.length) {\r\n            a.setAttribute(\"src\", d[1] + \".\" + d[2]);\r\n            a.interval = null;\r\n            macros.playsound.soundtracks[d[1]] = a;\r\n          } else console.log(\"Browser can't play '\" + d[1] + \"'\");\r\n        }\r\n      }\r\n    } while (d);\r\n  }\r\n}());<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>twine (sound) &lt;&lt;playsound &#8220;soundfile.mp3&#8221; &gt;&gt; plays the file &#8220;soundfile. mp3&#8221; from the start &lt;&lt;loopsound $heartbeat &gt;&gt; starts playing $heartbeat, over and over. Note: currently browsers are not that good at looping audio seamlessly &#8211; brief silences between loops may occur. &lt;&lt;fadeinsound $heartbeat &gt;&gt; is identical to loopsound, but fades in the sound over 2 seconds.&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":678,"menu_order":3,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/pages\/685"}],"collection":[{"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=685"}],"version-history":[{"count":3,"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/pages\/685\/revisions"}],"predecessor-version":[{"id":692,"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/pages\/685\/revisions\/692"}],"up":[{"embeddable":true,"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=\/wp\/v2\/pages\/678"}],"wp:attachment":[{"href":"https:\/\/seriousplaylab.com\/courses\/edu5855\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=685"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}