{"id":72,"date":"2011-07-19T10:27:38","date_gmt":"2011-07-19T08:27:38","guid":{"rendered":"http:\/\/esimov.zxq.net\/blog\/?p=72"},"modified":"2013-03-30T06:04:27","modified_gmt":"2013-03-30T06:04:27","slug":"sound-visualisation","status":"publish","type":"post","link":"https:\/\/esimov.com\/blog\/2011\/07\/19\/sound-visualisation\/","title":{"rendered":"Sound visualization"},"content":{"rendered":"<p>Sound visualization is one thing which I was always fascinated by. I stumbled upon this small <a href=\"http:\/\/marcinignac.com\/experiments\/tunnel-1k\/\">Javascript experiment<\/a> and thought would be nice to reproduce it in Actionscript, adding some spicy extra addons like interaction and sounds reacting shapes. So I decided to implement in Actionscript. Actually it went very well, in fact i only retained the core algorithm. The core algorithm consist in just a few lines:<\/p>\n<pre class=\" language-javascript\"><code class=\" language-javascript\">private <span class=\"token keyword\">function<\/span> createSurface<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">,<\/span> z<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>Point3D\r\n<span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">var<\/span> r<span class=\"token punctuation\">:<\/span>Number <span class=\"token operator\">=<\/span> W<span class=\"token operator\">\/<\/span><span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span>\r\n\t<span class=\"token keyword\">var<\/span> R<span class=\"token punctuation\">:<\/span>Number <span class=\"token operator\">=<\/span> W<span class=\"token operator\">\/<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">;<\/span>\r\n\t<span class=\"token keyword\">var<\/span> b<span class=\"token punctuation\">:<\/span>Number <span class=\"token operator\">=<\/span> <span class=\"token operator\">-<\/span><span class=\"token number\">10<\/span><span class=\"token operator\">*<\/span>Math<span class=\"token punctuation\">.<\/span>cos<span class=\"token punctuation\">(<\/span>a<span class=\"token operator\">*<\/span><span class=\"token number\">5<\/span> <span class=\"token operator\">+<\/span> T<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n\t<span class=\"token keyword\">return<\/span> <span class=\"token keyword\">new<\/span> Point3D<span class=\"token punctuation\">(<\/span>W<span class=\"token operator\">\/<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">+<\/span> <span class=\"token punctuation\">(<\/span>R<span class=\"token operator\">*<\/span>Math<span class=\"token punctuation\">.<\/span>cos<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">+<\/span> r<span class=\"token operator\">*<\/span>Math<span class=\"token punctuation\">.<\/span>sin<span class=\"token punctuation\">(<\/span>z<span class=\"token operator\">+<\/span><span class=\"token number\">2<\/span><span class=\"token operator\">*<\/span>T<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">\/<\/span>z <span class=\"token operator\">+<\/span> Math<span class=\"token punctuation\">.<\/span>cos<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span>b<span class=\"token punctuation\">,<\/span>\r\n\t\t\t\t\t\t\t   H<span class=\"token operator\">\/<\/span><span class=\"token number\">2<\/span> <span class=\"token operator\">+<\/span> <span class=\"token punctuation\">(<\/span>R<span class=\"token operator\">*<\/span>Math<span class=\"token punctuation\">.<\/span>sin<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">\/<\/span>z <span class=\"token operator\">+<\/span> Math<span class=\"token punctuation\">.<\/span>sin<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">)<\/span><span class=\"token operator\">*<\/span>b<span class=\"token punctuation\">,<\/span> Z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\nprivate <span class=\"token keyword\">function<\/span> drawQuad<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">,<\/span> da<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">,<\/span> z<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">,<\/span> dz<span class=\"token punctuation\">:<\/span>Number<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>void\r\n<span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">var<\/span> v<span class=\"token punctuation\">:<\/span>Array <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span>createSurface<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">,<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t\t\t\t   createSurface<span class=\"token punctuation\">(<\/span>a<span class=\"token operator\">+<\/span>da<span class=\"token punctuation\">,<\/span>z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t\t\t\t   createSurface<span class=\"token punctuation\">(<\/span>a<span class=\"token operator\">+<\/span>da<span class=\"token punctuation\">,<\/span> z<span class=\"token operator\">+<\/span>dz<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\r\n\t\t\t\t   createSurface<span class=\"token punctuation\">(<\/span>a<span class=\"token punctuation\">,<\/span> z<span class=\"token operator\">+<\/span>dz<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n\t_points <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> Vector<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\t_stroke <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> GraphicsStroke<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\t_stroke<span class=\"token punctuation\">.<\/span>thickness <span class=\"token operator\">=<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>\r\n\t_stroke<span class=\"token punctuation\">.<\/span>fill <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> GraphicsSolidFill<span class=\"token punctuation\">(<\/span><span class=\"token number\">0x102020<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0.95<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n\t_path <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> GraphicsPath<span class=\"token punctuation\">(<\/span><span class=\"token keyword\">new<\/span> Vector<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">new<\/span> Vector<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\t_path<span class=\"token punctuation\">.<\/span>moveTo<span class=\"token punctuation\">(<\/span>Point3D<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> Point3D<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">var<\/span> i<span class=\"token punctuation\">:<\/span>Number <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> v<span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">{<\/span>\r\n\t\t_path<span class=\"token punctuation\">.<\/span>lineTo<span class=\"token punctuation\">(<\/span>Point3D<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">,<\/span> Point3D<span class=\"token punctuation\">(<\/span>v<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\t_background <span class=\"token operator\">=<\/span> <span class=\"token keyword\">new<\/span> GraphicsSolidFill<span class=\"token punctuation\">(<\/span><span class=\"token number\">0x663399<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.95<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>First we create some quads using sine and cosine, multiplying by the radius, which is given as a constant. Then we store these quads on an array, setting their positions by calling the <kbd>GraphicsPath.lineTo<\/kbd> method. These positions are updated each time we loop through on an <kbd>EnterFrame<\/kbd> event listener. The fancy things happens here, where we use a fog variable to apply the shading effect by tweaking some depth illusion.<\/p>\n<p>And this is how it looks after implementation. By the way this is a good example of how robust and fast are <kbd>&lt;IGraphicsData&gt;<\/kbd> and <kbd>drawGraphicsData<\/kbd> functions combined.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.esimov.com\/experiments\/AS3\/tunnel.html\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-117\" title=\"Tunnel\" src=\"https:\/\/esimov.com\/blog\/wp-content\/uploads\/2011\/07\/Tunnel2.png\" alt=\"\" width=\"619\" height=\"466\" \/><\/a>(Move the mouse to change the color shading intensity)<\/p>\n<p>After implementing the basic structure I thought &#8211; following the suggestion of some of the active members of <a href=\"http:\/\/wonderfl.net\">wonderfl<\/a> community &#8211; it would be nice to add some extra feature like sound visualization. Initially this little effect consists of some sinusoidally\u00a0 curvy movement modifying the color intensity by the mouse position. You can check the effect by clicking on the image above.<\/p>\n<p>I was pleasantly surprised by the smoothly frame rate of the effect, so as i mentioned earlier the next step was to implement the algorithm for sound visualization. Thanks to <a href=\"http:\/\/wonderfl.net\/user\/makc3d\">makc3d <\/a>audio <a href=\"http:\/\/wonderfl.net\/c\/9SmG\">API<\/a> it was an easy job to obtain some samples which later could be used for the funky disco effect following the rhythm of the sound. This simple API connects to <a href=\"https:\/\/www.beatport.com\/\">BeatPort <\/a>portal, and by providing an unique key we can select from a various music genres.\u00a0I opted for dubstep only because the high variation of beats can produce a very differentiated transition (a next step could be to implement an interface for selecting the different music channel).<\/p>\n<p><a href=\"https:\/\/www.esimov.com\/experiments\/AS3\/main.html\" target=\"_blank\">This<\/a> is another variation.<\/p>\n<p>Playing with the values we can obtain different visualization effects. For example scaling up the bass bit rate we can obtain a nice upscaled flowing ring or reducing the radius value we should obtain a perfect circular cube like in the example below.<\/p>\n<p>Definitely a GUI interface would have been a better choice for playing with values, but because i put together this experiment in almost two hours i didn&#8217;t take the effort to polish the code. Maybe in a future time.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.esimov.com\/experiments\/AS3\/wormhole.html\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-107\" title=\"Tunnel\" src=\"https:\/\/esimov.com\/blog\/wp-content\/uploads\/2011\/07\/Tunnel1.png\" alt=\"\" width=\"618\" height=\"462\" \/><\/a>(Scroll the mouse to jump to the next track)<\/p>\n<p style=\"text-align: left;\">You can grab the source code <a href=\"https:\/\/www.esimov.com\/experiments\/source\/1k-tunnel+Sound.zip\" target=\"_blank\">here<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I called this experiment wormhole sound visualization because of procedural content generation, as the whole texture has been created procedurally. Below the fact that i&#8217;m absolutely interested in generative algorithm and imaginary i tried to explore Flash new drawing capabilities like the <kbd>IGraphicsData<\/kbd>.<\/p>\n","protected":false},"author":1,"featured_media":83,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,47,7,25,21,8],"tags":[10,12,15,18],"class_list":["post-72","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-actionscript-3","category-blog","category-experiments","category-codes","category-tutorials","category-visualization","tag-demo","tag-effect","tag-sound","tag-visualization-2"],"_links":{"self":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/comments?post=72"}],"version-history":[{"count":0,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/posts\/72\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/media\/83"}],"wp:attachment":[{"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/media?parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/categories?post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esimov.com\/blog\/wp-json\/wp\/v2\/tags?post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}