{"id":14612,"date":"2017-12-19T22:20:46","date_gmt":"2017-12-20T03:20:46","guid":{"rendered":"http:\/\/scruss.com\/blog\/?p=14612"},"modified":"2026-05-25T09:22:04","modified_gmt":"2026-05-25T13:22:04","slug":"synthesizing-simple-chords-with-sox","status":"publish","type":"post","link":"https:\/\/scruss.com\/blog\/2017\/12\/19\/synthesizing-simple-chords-with-sox\/","title":{"rendered":"Synthesizing simple chords with sox"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/sourceforge.net\/projects\/sox\/\">SoX<\/a> (now typically <a href=\"https:\/\/codeberg.org\/sox_ng\/sox_ng\">sox_ng<\/a>) can do almost anything with audio files \u2014 including synthesize audio from scratch. Unfortunately, SoX\u2019s syntax is more than a bit hard to follow, and the manual page isn\u2019t the most clear. But there is one example in the manual that gives a glimpse of what SoX can do:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">play -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \\ \n     delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">While it plays a nice chord, it&#8217;s not obvious how to make audio files from this process. I have a project coming up that needs a few simple guitar chords, and with much trial and error I got SoX to spit out audio files. Here&#8217;s what I keyed into the shell:<\/p>\n\n\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ncat guitar.txt | while read chord foo first third fifth\ndo\necho &quot;$chord&quot; :\nsox -n \\\n-r 16000 -b 16 &quot;chord-${chord}.wav&quot; \\\nsynth pl &quot;$first&quot; pl &quot;$third&quot; pl &quot;$fifth&quot; \\\ndelay 0 .05 .1 \\\nremix - \\\nfade 0 1 .095 \\\nnorm -1\ndone\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">with these lines in the file \u201cguitar.txt\u201d<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">G   :  G2  B2  D3\nC   :  C3  E3  G4\nD   :  D3  F#4 A3\nF   :  F3  A3  C4\nA   :  A3  C#4 E4\nE   :  E2  G#3 B3\nEm  :  E2  G3  B3\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">How the SoX command line breaks down:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>-n<\/strong> \u2014use no input file: SoX is going to generate the audio itself <\/li>\n\n\n\n<li><strong>-r 16000 -b 16 \u201cchord-${chord}.wav\u201d<\/strong> \u2014 with a sample rate of 16 kHz and 16-bits per sample, write to the output file \u201cchord-\u2026.wav\u201d <\/li>\n\n\n\n<li><strong>synth pl \u201c$first\u201d pl \u201c$third\u201d pl \u201c$fifth\u201d<\/strong> \u2014synthesize three plucked tones read from the file <\/li>\n\n\n\n<li><strong>delay 0 .05 .1<\/strong> \u2014delay the second tone 0.05 s after the first and likewise the third after the second. This simulates the striking of guitar strings very slightly apart. <\/li>\n\n\n\n<li><strong>remix \u2013<\/strong> \u2014mix the tones in an internal pipe to the output <\/li>\n\n\n\n<li><strong>fade 0 1 .095<\/strong> \u2014fade the audio smoothly down to nothing in 1 s <\/li>\n\n\n\n<li><strong>norm -1<\/strong> \u2014normalize the volume to -1 dB.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The chords don&#8217;t sound great: they&#8217;re played on only three strings, so they sound very sparse. As my application will be playing these through a tiny MEMS speaker, I don&#8217;t think anyone will notice.<\/p>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-G.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-F.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-Em.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-E.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-D.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-C.wav\"><\/audio><\/figure>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/chord-A.wav\"><\/audio><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Update<\/strong>: well, now I know how to do it, why not do all 36 autoharp strings and make the \u201cmagic ensues\u201d sound of just about every TV show (okay, it was <em>Bagpuss<\/em>, but that was the only one that mattered) of my childhood?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Glissando up:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sox -n -r 48000 -b 16 autoharp-up.wav synth pl \"F2\" pl \"G2\" pl \"C3\" pl \"D3\" pl \"E3\" pl \"F3\" pl \"F#3\" pl \"G3\" pl \"A3\" pl \"A#3\" pl \"B3\" pl \"C4\" pl \"C#4\" pl \"D4\" pl \"D#4\" pl \"E4\" pl \"F4\" pl \"F#4\" pl \"G4\" pl \"G#4\" pl \"A4\" pl \"A#4\" pl \"B4\" pl \"C5\" pl \"C#5\" pl \"D5\" pl \"D#5\" pl \"E5\" pl \"F5\" pl \"F#5\" pl \"G5\" pl \"G#5\" pl \"A5\" pl \"A#5\" pl \"B5\" pl \"C6\" delay 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 remix - fade 0 6 .1 norm -1<\/pre>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/autoharp-up1648.wav\"><\/audio><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Glissando down:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sox -n -r 48000 -b 16 autoharp-down.wav synth pl \"C6\" pl \"B5\" pl \"A#5\" pl \"A5\" pl \"G#5\" pl \"G5\" pl \"F#5\" pl \"F5\" pl \"E5\" pl \"D#5\" pl \"D5\" pl \"C#5\" pl \"C5\" pl \"B4\" pl \"A#4\" pl \"A4\" pl \"G#4\" pl \"G4\" pl \"F#4\" pl \"F4\" pl \"E4\" pl \"D#4\" pl \"D4\" pl \"C#4\" pl \"C4\" pl \"B3\" pl \"A#3\" pl \"A3\" pl \"G3\" pl \"F#3\" pl \"F3\" pl \"E3\" pl \"D3\" pl \"C3\" pl \"G2\" pl \"F2\" delay 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 1 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 remix - fade 0 6 .1 norm -1<\/pre>\n\n\n\n<figure class=\"wp-block-audio\"><audio controls src=\"http:\/\/scruss.com\/wordpress\/wp-content\/uploads\/2017\/12\/autoharp-down1648.wav\"><\/audio><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Could maybe use some reverb in there for the ultimate nostalgic effect.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SoX (now typically sox_ng) can do almost anything with audio files \u2014 including synthesize audio from scratch. Unfortunately, SoX\u2019s syntax is more than a bit hard to follow, and the manual page isn\u2019t the most clear. But there is one example in the manual that gives a glimpse of what SoX can do: play -n [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[7],"tags":[1310,1316,2903,270,1487],"class_list":["post-14612","post","type-post","status-publish","format-standard","hentry","category-computers-suck","tag-autoharp","tag-chords","tag-guitar","tag-linux","tag-sox"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/pQNZZ-3NG","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/14612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/comments?post=14612"}],"version-history":[{"count":11,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/14612\/revisions"}],"predecessor-version":[{"id":18130,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/posts\/14612\/revisions\/18130"}],"wp:attachment":[{"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/media?parent=14612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/categories?post=14612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scruss.com\/blog\/wp-json\/wp\/v2\/tags?post=14612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}