{"id":771,"date":"2014-08-22T15:11:58","date_gmt":"2014-08-22T19:11:58","guid":{"rendered":"https:\/\/blog.splice.com\/?p=771"},"modified":"2025-07-21T10:47:07","modified_gmt":"2025-07-21T14:47:07","slug":"wire-up-a-synth-with-the-web-audio-api","status":"publish","type":"post","link":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/","title":{"rendered":"Wire Up a Synth with the Web Audio API"},"content":{"rendered":"<p>In my <a title=\"Draw by Numbers with SVG\" href=\"https:\/\/splice.com\/blog\/draw-by-numbers-with-svg\/\">last post<\/a>, I wrote about rendering graphics programmatically on the web. This week, I\u2019d like to do the same for audio. Instead of dropping in GIFs or MP3s, the creative tinkerer can generate sound and image using some elemental yet powerful syntaxes, right here in the browser you\u2019re reading in. (Scroll down for a live demo!)<\/p>\n<p>The synth geeks on Splice know what I\u2019m talking about. Many of the keyboards, basslines, and leads we know and love are produced in the same way they were a half century ago on analog electronics: The performer sets controls and plays into a graph of nodes which generate, process, shape, or recombine audio signals according to specific mathematical functions. The most sophisticated software synths earn notoriety, like <a href=\"https:\/\/splice.com\/plugins\/97-massive\">Massive<\/a>, our current #1 synth on Splice, and the arguable backbone of US dubstep.<\/p>\n<p>The totally bananas part is that, via the <a href=\"http:\/\/webaudio.github.io\/web-audio-api\/\" target=\"_new\" rel=\"noopener\">Web Audio API<\/a>, web browsers are beginning to support this functionality normally reserved for native plugins. It\u2019s still experimental (Sorry, Internet Explorer and Android), and a bit rough around the edges, but exciting nonetheless.<\/p>\n<p>Of the libraries which have sprouted up around this functionality (including <a href=\"http:\/\/flockingjs.org\/\" target=\"_new\" rel=\"noopener\">Flocking<\/a> and <a href=\"http:\/\/oampo.github.io\/Audiolet\/\" target=\"_new\" rel=\"noopener\">Audiolet<\/a>), I\u2019ve chosen to highlight <a href=\"http:\/\/mohayonao.github.io\/timbre.js\/\" target=\"_new\" rel=\"noopener\">timbre.js<\/a> in this post, which does an excellent job of abstracting away the wiring up of audio nodes in an elegant DSL.<\/p>\n<p>To explain, here\u2019s a rough graph of my simple, kinda organic-sounding synth patch:<\/p>\n<p><center><img decoding=\"async\" class=\"alignnone size-full wp-image-781 lazyload\" data-src=\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/timbre-graph.png\" alt=\"timbre-graph\" width=\"570\" height=\"354\" data-srcset=\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/timbre-graph.png 570w, https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/timbre-graph-300x186.png 300w\" data-sizes=\"(max-width: 570px) 100vw, 570px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 570px; --smush-placeholder-aspect-ratio: 570\/354;\" \/><\/center>Because there are no crosswise interdependencies between nodes, timbre.js lets me describe all this in a set of nested JavaScript function calls:<\/p>\n<pre><code>var synth = T(\r\n  \"perc\", {a: 100, r: 400},\r\n  T(\"sin\", {freq: freqSlide, mul: 0.25}),\r\n  T(\"sin\", {freq: freqSlide * 1.01, mul: 0.05, phase: Math.PI * 0.25}),\r\n  T(\"eq\", {lpf: [100, 0.0, -48.0]},\r\n    T(\"sin\", {freq: freqSlide * 2, mul: 0.25})\r\n  ),\r\n  T(\"perc\", {r: 10},\r\n    T(\"saw\", {freq: freqSlide * 4, mul: 0.05})\r\n  ),\r\n  T(\"perc\", {a: 100, r: 100},\r\n    T(\"noise\", {mul:0.0})\r\n  )\r\n)<\/code><\/pre>\n<p>The first <code>T()<\/code> in the code snippet corresponds to the rightmost node in the schematic. The genius of timbre.js is to allow <em>splats<\/em> (unspecified numbers of arguments) of other <code>T()<\/code>s to all be summed together as audio signals. So when you use the elemental <code>T()<\/code> function, the first arguments describe that node\u2014and all subsequent arguments are summed and routed right through it. This allows for the expression of complex synths in very short definitions.<\/p>\n<p>You can hear my amateur sound design here, tuned to a <a href=\"http:\/\/en.wikipedia.org\/wiki\/Just_intonation\" target=\"_new\" rel=\"noopener\">just-intoned<\/a> major scale:<\/p>\n<p><iframe src=\"https:\/\/s3.amazonaws.com\/adamflorin\/splice\/timbre.html\" width=\"600\" height=\"80\"><\/iframe><\/p>\n<p>While it may sometimes be marred by clipping (i.e. harsh artifacts), synthesis in the browser is an exciting development for online games, synths, and who knows what else. Have fun playing, and please <a href=\"mailto:adam@splice.com\">reach out<\/a> to me if you\u2019d like to know more!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my last post, I wrote about rendering graphics programmatically on the web. This week, I\u2019d like to do the same for audio. Instead of&#8230;<\/p>\n","protected":false},"author":2,"featured_media":780,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[61],"tags":[115],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Wire up a synth with the Web Audio API<\/title>\n<meta name=\"description\" content=\"Use timbre.js and the Web Audio API to create synths in the browser.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wire up a synth with the Web Audio API\" \/>\n<meta property=\"og:description\" content=\"Use timbre.js and the Web Audio API to create synths in the browser.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog | Splice\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Splice\" \/>\n<meta property=\"article:author\" content=\"http:\/\/facebook.com\/spliceofficial\" \/>\n<meta property=\"article:published_time\" content=\"2014-08-22T19:11:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-21T14:47:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"400\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Team Splice\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/splice\" \/>\n<meta name=\"twitter:site\" content=\"@splice\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Team Splice\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\"},\"author\":{\"name\":\"Team Splice\",\"@id\":\"https:\/\/splice.com\/blog\/#\/schema\/person\/1264212de6b56a47de705ec3ad103943\"},\"headline\":\"Wire Up a Synth with the Web Audio API\",\"datePublished\":\"2014-08-22T19:11:58+00:00\",\"dateModified\":\"2025-07-21T14:47:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\"},\"wordCount\":407,\"publisher\":{\"@id\":\"https:\/\/splice.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg\",\"keywords\":[\"engineering\"],\"articleSection\":[\"Engineering\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\",\"url\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\",\"name\":\"Wire up a synth with the Web Audio API\",\"isPartOf\":{\"@id\":\"https:\/\/splice.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg\",\"datePublished\":\"2014-08-22T19:11:58+00:00\",\"dateModified\":\"2025-07-21T14:47:07+00:00\",\"description\":\"Use timbre.js and the Web Audio API to create synths in the browser.\",\"breadcrumb\":{\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage\",\"url\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg\",\"contentUrl\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg\",\"width\":600,\"height\":400},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/splice.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Wire Up a Synth with the Web Audio API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/splice.com\/blog\/#website\",\"url\":\"https:\/\/splice.com\/blog\/\",\"name\":\"Splice Blog\",\"description\":\"An inside look at making music\",\"publisher\":{\"@id\":\"https:\/\/splice.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/splice.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/splice.com\/blog\/#organization\",\"name\":\"Splice\",\"alternateName\":\"Splice Sounds\",\"url\":\"https:\/\/splice.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/splice.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2023\/09\/Splice-logo-black-background.png\",\"contentUrl\":\"https:\/\/splice.com\/blog\/wp-content\/uploads\/2023\/09\/Splice-logo-black-background.png\",\"width\":2928,\"height\":1540,\"caption\":\"Splice\"},\"image\":{\"@id\":\"https:\/\/splice.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Splice\",\"https:\/\/x.com\/splice\",\"https:\/\/www.instagram.com\/splice\/\",\"https:\/\/www.youtube.com\/@splice\",\"https:\/\/discord.com\/invite\/splice\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/splice.com\/blog\/#\/schema\/person\/1264212de6b56a47de705ec3ad103943\",\"name\":\"Team Splice\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/splice.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4428b1733406dca9c238897202320bb3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4428b1733406dca9c238897202320bb3?s=96&d=mm&r=g\",\"caption\":\"Team Splice\"},\"sameAs\":[\"http:\/\/splice.wpengine.com\",\"http:\/\/facebook.com\/spliceofficial\",\"https:\/\/instagram.com\/splice\",\"https:\/\/x.com\/http:\/\/twitter.com\/splice\",\"https:\/\/www.youtube.com\/channel\/UCb8xLPa5RP8TnCsU7E5ASKQ\"],\"url\":\"https:\/\/splice.com\/blog\/author\/splice\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Wire up a synth with the Web Audio API","description":"Use timbre.js and the Web Audio API to create synths in the browser.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/","og_locale":"en_US","og_type":"article","og_title":"Wire up a synth with the Web Audio API","og_description":"Use timbre.js and the Web Audio API to create synths in the browser.","og_url":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/","og_site_name":"Blog | Splice","article_publisher":"https:\/\/www.facebook.com\/Splice","article_author":"http:\/\/facebook.com\/spliceofficial","article_published_time":"2014-08-22T19:11:58+00:00","article_modified_time":"2025-07-21T14:47:07+00:00","og_image":[{"width":600,"height":400,"url":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg","type":"image\/jpeg"}],"author":"Team Splice","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/splice","twitter_site":"@splice","twitter_misc":{"Written by":"Team Splice","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#article","isPartOf":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/"},"author":{"name":"Team Splice","@id":"https:\/\/splice.com\/blog\/#\/schema\/person\/1264212de6b56a47de705ec3ad103943"},"headline":"Wire Up a Synth with the Web Audio API","datePublished":"2014-08-22T19:11:58+00:00","dateModified":"2025-07-21T14:47:07+00:00","mainEntityOfPage":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/"},"wordCount":407,"publisher":{"@id":"https:\/\/splice.com\/blog\/#organization"},"image":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage"},"thumbnailUrl":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg","keywords":["engineering"],"articleSection":["Engineering"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/","url":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/","name":"Wire up a synth with the Web Audio API","isPartOf":{"@id":"https:\/\/splice.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage"},"image":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage"},"thumbnailUrl":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg","datePublished":"2014-08-22T19:11:58+00:00","dateModified":"2025-07-21T14:47:07+00:00","description":"Use timbre.js and the Web Audio API to create synths in the browser.","breadcrumb":{"@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#primaryimage","url":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg","contentUrl":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2014\/08\/buchla-modular-synthesizer-600.jpg","width":600,"height":400},{"@type":"BreadcrumbList","@id":"https:\/\/splice.com\/blog\/wire-up-a-synth-with-the-web-audio-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/splice.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Wire Up a Synth with the Web Audio API"}]},{"@type":"WebSite","@id":"https:\/\/splice.com\/blog\/#website","url":"https:\/\/splice.com\/blog\/","name":"Splice Blog","description":"An inside look at making music","publisher":{"@id":"https:\/\/splice.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/splice.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/splice.com\/blog\/#organization","name":"Splice","alternateName":"Splice Sounds","url":"https:\/\/splice.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/splice.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2023\/09\/Splice-logo-black-background.png","contentUrl":"https:\/\/splice.com\/blog\/wp-content\/uploads\/2023\/09\/Splice-logo-black-background.png","width":2928,"height":1540,"caption":"Splice"},"image":{"@id":"https:\/\/splice.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Splice","https:\/\/x.com\/splice","https:\/\/www.instagram.com\/splice\/","https:\/\/www.youtube.com\/@splice","https:\/\/discord.com\/invite\/splice"]},{"@type":"Person","@id":"https:\/\/splice.com\/blog\/#\/schema\/person\/1264212de6b56a47de705ec3ad103943","name":"Team Splice","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/splice.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4428b1733406dca9c238897202320bb3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4428b1733406dca9c238897202320bb3?s=96&d=mm&r=g","caption":"Team Splice"},"sameAs":["http:\/\/splice.wpengine.com","http:\/\/facebook.com\/spliceofficial","https:\/\/instagram.com\/splice","https:\/\/x.com\/http:\/\/twitter.com\/splice","https:\/\/www.youtube.com\/channel\/UCb8xLPa5RP8TnCsU7E5ASKQ"],"url":"https:\/\/splice.com\/blog\/author\/splice\/"}]}},"_links":{"self":[{"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/posts\/771"}],"collection":[{"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/comments?post=771"}],"version-history":[{"count":2,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/posts\/771\/revisions"}],"predecessor-version":[{"id":36793,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/posts\/771\/revisions\/36793"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/media\/780"}],"wp:attachment":[{"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/media?parent=771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/categories?post=771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/splice.com\/blog\/wp-json\/wp\/v2\/tags?post=771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}