aboutsummaryrefslogtreecommitdiff
path: root/public/what-would-dna-sound-if-synthesized.html
diff options
context:
space:
mode:
Diffstat (limited to 'public/what-would-dna-sound-if-synthesized.html')
-rwxr-xr-xpublic/what-would-dna-sound-if-synthesized.html237
1 files changed, 0 insertions, 237 deletions
diff --git a/public/what-would-dna-sound-if-synthesized.html b/public/what-would-dna-sound-if-synthesized.html
deleted file mode 100755
index fa5188f..0000000
--- a/public/what-would-dna-sound-if-synthesized.html
+++ /dev/null
@@ -1,237 +0,0 @@
1<!doctype html><html lang=en-us><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=generator content="JBMAFP - github.com/mitjafelicijan/jbmafp"><link href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL69vf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv76+/8LBwQkAAAAAAAAAAAAAAAC+vb3/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+9vf/Bv78JAAAAAAAAAAAAAAAAu7q6/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC7ubr/vr29CAAAAAAAAAAAy8nJAZ6foP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnqGj/6GipAoAAAAAHLjU/xcXHf/BwsL/I8XY/yPK3v8XGiD/IbjL/yPF2f8XGiD/Fxkf/yLF2f8gnK3/Fxog/62ztv8fwNf/FRcd/x271v8mz93/GRsi/xkXHf8p097/GiIp/xobIv8p0t3/KdPe/xocIv8fYmr/KNPe/xoZH/8aHCL/J87c/xy81/8VFxz/IsPZ/8zS0/8XGiD/Ir/R/yPH2/8XGiD/Fxkf/yPH2/8dd4T/GBog/yPJ3f8jyNr/uru9/xcUGv8cudb/EhITDKi5vRKlvMP/RUpOERwcHRAdOj4QHTk8EBwdHRAdNTgQHTo/EBwcHRAcHB0QSGduEKW4vf+koqQfHzg+EBqz0ewSFRv7EyMr/xq51vsTERb7ExUb+xq41fsau9j7ExUb+xiPp/sZudb7ExUb+xMVG/sZuNX/GKvI/BIUGfMdvdn/IrfL/xcaIP8n1eb/J9Dh/xkcIf8ZGR7/J8/f/xxCSv8ZGyH/J9Dg/ybQ4P8ZHCL/FSQs/yPK3/8UExj/GE1b/ybS5P8ZGB7/Ghwj/ynW5P8p2Ob/Ghwi/yWrtv8p1eH/Ghwi/xocIv8p1uT/J8XT/xkcIv8m1un/Hb7d/xUYH/8hzOr/HtHu/xcaIf8XGB//I8vi/xgxOv8XGSD/I8rg/yPK4P8XGiD/GUFL/yPP6f8SERj/Fhkh/x3A4f8AAAAAJ2f9/ydr//8mZPH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlYu38J2v//ydo/f8AAAAAAAAAAAd8/fkFqf//Iob8sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMY39awWr//8FfP3/AAAAAAAAAAAFm/7/SfD//wR+/f8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOB/f9B7v//BaX+/wAAAAAAAAAAQ878SAyZ/v9n1v4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADu9v8DDJb+/z3N/XgAAAAA3/sAAN/7AADf+wAA3/sAAAAAAAAAAAAAAAAAAN/7AAAAAAAAAAAAAAAAAAAAAAAAj/EAAI/5AACP8QAA3/sAAA==" rel=icon type=image/x-icon><title>What would DNA sound if synthesized to an audio file</title><meta name=description content="IntroductionLately, I have been thinking a lot about the nature of life, what are thefoundation blocks of life and things like that."><meta name=author content="Mitja Felicijan"><link rel=alternate type=application/rss+xml title="Mitja Felicijan's posts" href=https://mitjafelicijan.com/index.xml><link rel=alternate type=application/rss+xml title="Mitja Felicijan's notes" href=https://mitjafelicijan.com/notes.xml><style>:root{--border-color:gainsboro;--border-size:2px;--link-color:blue;--bg-color:#eee}*::selection{background:var(--link-color);color:#fff}*::-moz-selection{background:var(--link-color);color:#fff}*::-webkit-selection{background:var(--link-color);color:#fff}body{padding:2.5rem;max-width:1900px;background:#fff;font-family:sans-serif;line-height:1.35rem;font-size:16px}hr{border:0;border-bottom:var(--border-size)solid var(--border-color);margin-block-start:1.5rem}a{color:var(--link-color);text-decoration:none}h1,h2,h3{line-height:initial}h1{font-size:xx-large}footer{margin-block-start:2rem}cap{text-transform:capitalize}blockquote{font-style:italic}table{max-width:100%;border:var(--border-size)solid var(--border-color);border-collapse:separate;border-spacing:0}table thead tr th{border-bottom:var(--border-size)solid var(--border-color);text-align:left}table th,table td{padding:.5em .8em}ul.list li{padding:.2em 0}ul{line-height:1.35em}pre{text-wrap:nowrap;overflow-x:auto;padding:0 1em;border:var(--border-size)solid var(--border-color)}code{padding:0 3px;font-size:14px;border:0;background:var(--bg-color)}pre code{line-height:1.3em;background:#fff}pre,code,pre *,code *{font-family:monospace}figure{margin-inline-start:0;margin-inline-end:0}figcaption{width:800px;max-width:100%;text-align:center}figcaption p{margin:.3em 0 1.5em;font-style:italic}img,video,audio{width:800px;max-width:100%;border:var(--border-size)solid var(--border-color);padding:.5em}header nav{display:flex;gap:.9rem}article iframe{margin:0!important}audio::-webkit-media-controls-enclosure{border-radius:0}@media only screen and (max-width:600px){body{padding:.5em;word-wrap:break-word}header nav{gap:.7rem}header nav .hob{display:none}a{word-wrap:break-word}img,video,audio{padding:0}}</style><header><nav class=main itemscope itemtype=http://schema.org/SiteNavigationElement role=navigation aria-label="Main navigation"><a href=/>Home</a>
2<a href=/#posts>Posts</a>
3<a href=/#notes>Notes</a>
4<a href=/#sideprojects class=hob>Side Projects</a>
5<a href=/vault.html>Vault</a>
6<a href=https://github.com/mitjafelicijan target=_blank>Code</a>
7<a href=/mitjafelicijan.pgp.pub.txt target=_blank class=hob>PGP</a>
8<a href=/curriculum-vitae.html>CV</a>
9<a href=/index.xml target=_blank class=hob>RSS</a></nav></header><main role=main><article itemtype=http://schema.org/Article><h1 itemtype=headline>What would DNA sound if synthesized to an audio file</h1><p><cap>post</cap>, Jul 5, 2022 on <a href=https://mitjafelicijan.com>Mitja Felicijan's blog</a><div><h2 id=introduction>Introduction</h2><p>Lately, I have been thinking a lot about the nature of life, what are the
10foundation blocks of life and things like that. It's remarkable how complex and
11on the other hand simple the creation is when you look at it. The miracle of
12life keeps us grounded when our imagination goes wild. If the DNA are the blocks
13of life, you could consider them to be an API nature provided us to better
14understand all of this chaos masquerading as order.<p>I have been reading a lot about superintelligence and our somehow misguided path
15to create general artificial intelligence. What would the building blocks or our
16creation look like? Is the compression really the ultimate storage of
17information? Will our creation also ponder this questions when creating new
18worlds for themselves, or will we just disappear into the vastness of
19possibilities? It is a little offensive that we are playing God whilst being
20completely ignorant of our own reality. Who knows! Like many other
21breakthroughs, this one will also come at a cost not known to us when it finally
22happens.<p>To keep things a bit lighter, I decided to convert some popular DNA sequences
23into an audio files for us to listen to. I am not the first one, nor I will be
24the last one to do this. But it is an interesting exercise in better
25understanding the relationship between art and science. Maybe listening to DNA
26instead of parsing it will find a way into better understanding, or at least
27enjoying the creation and cryptic nature of life.<h2 id=dna-encoding-and-primer-example>DNA encoding and primer example</h2><p>I have been exploring DNA in the past in my post from about 3 years ago in
28<a href=/encoding-binary-data-into-dna-sequence.html>Encoding binary data into DNA
29sequence</a> where I have been
30converting all sorts of data into DNA sequences.<p>This will be a similar exercise but instead of converting to DNA, I will be
31generating tones from Nucleotides.<table><thead><tr><th>Nucleotides<th>Note<th>Frequency<tbody><tr><td><strong>A</strong> (Adenine)<td>A<td>440 Hz<tr><td><strong>C</strong> (Cytosine)<td>C<td>783.99 Hz<tr><td><strong>G</strong> (Guanine)<td>G<td>523.25 Hz<tr><td><strong>T</strong> (Thymine)<td>D<td>587.33 Hz</table><p>Since we do not have T in equal-tempered scale, I choose D to represent T note.<p>You can check <a href=https://pages.mtu.edu/~suits/notefreqs.html>Frequencies for equal-tempered scale, A4 = 440
32Hz</a>. For this tuning, we also
33choose <code>Speed of Sound = 345 m/s = 1130 ft/s = 770 miles/hr</code>.<p>Now that we have this out of the way, we can also brush up on the DNA sequencing
34a bit. This is a famous quote I also used for the encoding tests, and it goes
35like this.<blockquote><p>How wonderful that we have met with a paradox. Now we have some hope of
36making progress.
37― Niels Bohr</blockquote><pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span>&gt;SEQ1
38</span></span><span style=display:flex><span>GACAGCTTGTGTACAAGTGTGCTTGCTCGCGAGCGGGTACGCGCGTGGGCTAACAAGTGA
39</span></span><span style=display:flex><span>GCCAGCAGGTGAACAAGTGTGCGGACAAGCCAGCAGGTGCGCGGACAAGCTGGCGGGTGA
40</span></span><span style=display:flex><span>ACAAGTGTGCCGGTGAGCCAACAAGCAGACAAGTAAGCAGGTACGCAGGCGAGCTTGTCA
41</span></span><span style=display:flex><span>ACTCACAAGATCGCTTGTGTACAAGTGTGCGGACAAGCCAGCAGGTGCGCGGACAAGTAT
42</span></span><span style=display:flex><span>GCTTGCTGGCGGACAAGCCAGCTTGTAAGCGGACAAGCTTGCGCACAAGCTGGCAGGCCT
43</span></span><span style=display:flex><span>GCCGGCTCGCGTACAAATTCACAAGTAAGTACGCTTGCGTGTACGCGGGTATGTATACTC
44</span></span><span style=display:flex><span>AACCTCACCAAACGGGACAAGATCGCCGGCGGGCTAGTATACAAGAACGCTTGCCAGTAC
45</span></span><span style=display:flex><span>AACC
46</span></span></code></pre><p>This is what we gonna work with to get things rolling forward, when creating
47parser and waveform generator.<h2 id=parsing-dna-data>Parsing DNA data</h2><p>This step is rather simple one. All we need to do is parse input DNA sequence in
48<a href=https://en.wikipedia.org/wiki/FASTA_format>FASTA format</a> well known in
49<a href=https://en.wikipedia.org/wiki/Bioinformatics>Bioinformatics</a> to extract single
50Nucleotides that will be converted into separate tones based on equal-tempered
51scale explained above.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span>nucleotide_tone_map = {
52</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;A&#39;</span>: 440,
53</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;C&#39;</span>: 523.25,
54</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;G&#39;</span>: 783.99,
55</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;T&#39;</span>: 587.33, <span style=color:green># converted to D</span>
56</span></span><span style=display:flex><span>}
57</span></span><span style=display:flex><span>
58</span></span><span style=display:flex><span><span style=color:#00f>def</span> split(word):
59</span></span><span style=display:flex><span> <span style=color:#00f>return</span> [char <span style=color:#00f>for</span> char <span style=color:#00f>in</span> word]
60</span></span><span style=display:flex><span>
61</span></span><span style=display:flex><span><span style=color:#00f>def</span> generate_from_dna_sequence(sequence):
62</span></span><span style=display:flex><span> <span style=color:#00f>for</span> nucleotide <span style=color:#00f>in</span> split(sequence):
63</span></span><span style=display:flex><span> print(nucleotide, nucleotide_tone_map[nucleotide])
64</span></span></code></pre><h2 id=generating-sine-wave>Generating sine wave</h2><p>Because we are essentially creating a long stream of notes we will be appending
65sine notes to a global array we will later use for creating a WAV file out of
66it.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span><span style=color:#00f>import</span> math
67</span></span><span style=display:flex><span>
68</span></span><span style=display:flex><span><span style=color:#00f>def</span> append_sinewave(freq=440.0, duration_milliseconds=500, volume=1.0):
69</span></span><span style=display:flex><span> <span style=color:#00f>global</span> audio
70</span></span><span style=display:flex><span>
71</span></span><span style=display:flex><span> num_samples = duration_milliseconds * (sample_rate / 1000.0)
72</span></span><span style=display:flex><span>
73</span></span><span style=display:flex><span> <span style=color:#00f>for</span> x <span style=color:#00f>in</span> range(int(num_samples)):
74</span></span><span style=display:flex><span> audio.append(volume * math.sin(2 * math.pi * freq * (x / sample_rate)))
75</span></span><span style=display:flex><span>
76</span></span><span style=display:flex><span> <span style=color:#00f>return</span>
77</span></span></code></pre><p>The sine wave generated here is the standard beep. If you want something more
78aggressive, you could try a square or saw tooth waveform.<h2 id=generating-a-wav-file-from-accumulated-sine-waves>Generating a WAV file from accumulated sine waves</h2><pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span><span style=color:#00f>import</span> wave
79</span></span><span style=display:flex><span><span style=color:#00f>import</span> struct
80</span></span><span style=display:flex><span>
81</span></span><span style=display:flex><span><span style=color:#00f>def</span> save_wav(file_name):
82</span></span><span style=display:flex><span> wav_file = wave.open(file_name, <span style=color:#a31515>&#39;w&#39;</span>)
83</span></span><span style=display:flex><span> nchannels = 1
84</span></span><span style=display:flex><span> sampwidth = 2
85</span></span><span style=display:flex><span>
86</span></span><span style=display:flex><span> nframes = len(audio)
87</span></span><span style=display:flex><span> comptype = <span style=color:#a31515>&#39;NONE&#39;</span>
88</span></span><span style=display:flex><span> compname = <span style=color:#a31515>&#39;not compressed&#39;</span>
89</span></span><span style=display:flex><span> wav_file.setparams((nchannels, sampwidth, sample_rate, nframes, comptype, compname))
90</span></span><span style=display:flex><span>
91</span></span><span style=display:flex><span> <span style=color:#00f>for</span> sample <span style=color:#00f>in</span> audio:
92</span></span><span style=display:flex><span> wav_file.writeframes(struct.pack(<span style=color:#a31515>&#39;h&#39;</span>, int(sample * 32767.0)))
93</span></span><span style=display:flex><span>
94</span></span><span style=display:flex><span> wav_file.close()
95</span></span></code></pre><p>44100 is the industry standard sample rate - CD quality. If you need to save on
96file size, you can adjust it downwards. The standard for low quality is, 8000 or
978kHz.<p>WAV files here are using short, 16 bit, signed integers for the sample size.
98So, we multiply the floating-point data we have by 32767, the maximum value for
99a short integer.<blockquote><p>It is theoretically possible to use the floating point -1.0 to 1.0 data
100directly in a WAV file, but not obvious how to do that using the wave module
101in Python.</blockquote><h2 id=generating-spectograms>Generating Spectograms</h2><p>I have tried two methods of doing this and both were just fine. I however opted
102out to use the <a href=https://linux.die.net/man/1/sox>SoX - Sound eXchange, the Swiss Army knife of audio
103manipulation</a> one because it didn't require
104anything else.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span>sox output.wav -n spectrogram -o spectrogram.png
105</span></span></code></pre><p>An example spectrogram of Ludwig van Beethoven Symphony No. 6 First movement.</p><audio controls><source src=/posts/dna-synthesized/symphony-no6-1st-movement.mp3 type=audio/mpeg></audio><figure><img src=/posts/dna-synthesized/symphony-no6-1st-movement.png alt="Ludwig van Beethoven Symphony No. 6 First movement"></figure><p>The other option could also be in combination with
106<a href=http://www.gnuplot.info/>gnuplot</a>. This would require an intermediary step,
107however.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span>sox output.wav audio.dat
108</span></span><span style=display:flex><span>tail -n+3 audio.dat &gt; audio_only.dat
109</span></span><span style=display:flex><span>gnuplot audio.gpi
110</span></span></code></pre><p>And input file <code>audio.gpi</code> that would be passed to gnuplot looks something like
111this.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span># set output format and size
112</span></span><span style=display:flex><span>set term png size 1000,280
113</span></span><span style=display:flex><span>
114</span></span><span style=display:flex><span># set output file
115</span></span><span style=display:flex><span>set output &#34;audio.png&#34;
116</span></span><span style=display:flex><span>
117</span></span><span style=display:flex><span># set y range
118</span></span><span style=display:flex><span>set yr [-1:1]
119</span></span><span style=display:flex><span>
120</span></span><span style=display:flex><span># we want just the data
121</span></span><span style=display:flex><span>unset key
122</span></span><span style=display:flex><span>unset tics
123</span></span><span style=display:flex><span>unset border
124</span></span><span style=display:flex><span>set lmargin 0
125</span></span><span style=display:flex><span>set rmargin 0
126</span></span><span style=display:flex><span>set tmargin 0
127</span></span><span style=display:flex><span>set bmargin 0
128</span></span><span style=display:flex><span>
129</span></span><span style=display:flex><span># draw rectangle to change background color
130</span></span><span style=display:flex><span>set obj 1 rectangle behind from screen 0,0 to screen 1,1
131</span></span><span style=display:flex><span>set obj 1 fillstyle solid 1.0 fillcolor rgbcolor &#34;#ffffff&#34;
132</span></span><span style=display:flex><span>
133</span></span><span style=display:flex><span># draw data with foreground color
134</span></span><span style=display:flex><span>plot &#34;audio_only.dat&#34; with lines lt rgb &#39;red&#39;
135</span></span></code></pre><h2 id=pre-generated-sequences>Pre-generated sequences</h2><p>What I did was take interesting parts from an animal's genome and feed it to a
136tone generator script. This then generated a WAV file and I converted those to
137MP3, so they can be played in a browser. The last step was creating a
138spectrogram based on a WAV file.<h3 id=niels-bohr-quote>Niels Bohr quote</h3><audio controls><source src=/posts/dna-synthesized/quote/out.mp3 type=audio/mpeg></audio><figure><img src=/posts/dna-synthesized/quote/spectogram.png alt=Spectogram></figure><h3 id=mouse>Mouse</h3><p>This is part of a mouse genome <code>Mus_musculus.GRCm39.dna.nonchromosomal</code>. You
139can get <a href=http://ftp.ensembl.org/pub/release-106/fasta/mus_musculus/dna/>genom data
140here</a>.</p><audio controls><source src=/posts/dna-synthesized/mouse/out.mp3 type=audio/mpeg></audio><figure><img src=/posts/dna-synthesized/mouse/spectogram.png alt=Spectogram></figure><h3 id=bison>Bison</h3><p>This is part of a bison genome <code>Bison_bison_bison.Bison_UMD1.0.cdna</code>. You can
141get <a href=http://ftp.ensembl.org/pub/release-106/fasta/bison_bison_bison/cdna/>genom data
142here</a>.</p><audio controls><source src=/posts/dna-synthesized/bison/out.mp3 type=audio/mpeg></audio><figure><img src=/posts/dna-synthesized/bison/spectogram.png alt=Spectogram></figure><h3 id=taurus>Taurus</h3><p>This is part of a taurus genome <code>Bos_taurus.ARS-UCD1.2.cdna</code>. You can get
143<a href=http://ftp.ensembl.org/pub/release-106/fasta/bos_taurus/cdna/>genom data
144here</a>.</p><audio controls><source src=/posts/dna-synthesized/taurus/out.mp3 type=audio/mpeg></audio><figure><img src=/posts/dna-synthesized/taurus/spectogram.png alt=Spectogram></figure><h2 id=making-a-drummer-out-of-a-dna-sequence>Making a drummer out of a DNA sequence</h2><p>To make things even more interesting, I decided to send this data via MIDI to my
145<a href=https://www.elektron.se/en/model-samples>Elektron Model:Samples</a>. This is a
146really cool piece of equipment that supports MIDI in via USB and 3.5 mm audio
147jack.<p>Elektron is connected to my MacBook via USB cable and audio out is patched to a
148Sony Bluetooth speaker I have that supports 3.5 mm audio in. Elektron doesn't
149have internal speakers.<figure><img src=/posts/dna-synthesized/elektron/IMG_0619.jpg alt></figure><figure><img src=/posts/dna-synthesized/elektron/IMG_0620.jpg alt></figure><figure><img src=/posts/dna-synthesized/elektron/IMG_0622.jpg alt></figure><p>For communicating with Elektron, I choose <code>pygame</code> Python module that has MIDI
150built in. With this, it was rather simple to send notes to the device. All I did
151was map MIDI notes to the actual Nucleotides.<p>Before all of this I also checked Audio MIDI Setup app under MacOS and checked
152MIDI Studio by pressing ⌘-2.<figure><img src=/posts/dna-synthesized/elektron/midi-studio.jpg alt></figure><p>The whole script that parses and send notes to the Elektron looks like this.<pre tabindex=0 style=background-color:#fff><code><span style=display:flex><span><span style=color:#00f>import</span> pygame.midi
153</span></span><span style=display:flex><span><span style=color:#00f>import</span> time
154</span></span><span style=display:flex><span>
155</span></span><span style=display:flex><span>pygame.midi.init()
156</span></span><span style=display:flex><span>
157</span></span><span style=display:flex><span>print(pygame.midi.get_default_output_id())
158</span></span><span style=display:flex><span>print(pygame.midi.get_device_info(0))
159</span></span><span style=display:flex><span>
160</span></span><span style=display:flex><span>player = pygame.midi.Output(1)
161</span></span><span style=display:flex><span>player.set_instrument(2)
162</span></span><span style=display:flex><span>
163</span></span><span style=display:flex><span><span style=color:#00f>def</span> send_note(note, velocity):
164</span></span><span style=display:flex><span> <span style=color:#00f>global</span> player
165</span></span><span style=display:flex><span> player.note_on(note, velocity)
166</span></span><span style=display:flex><span> time.sleep(0.3)
167</span></span><span style=display:flex><span> player.note_off(note, velocity)
168</span></span><span style=display:flex><span>
169</span></span><span style=display:flex><span>
170</span></span><span style=display:flex><span>nucleotide_midi_map = {
171</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;A&#39;</span>: 60,
172</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;C&#39;</span>: 90,
173</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;G&#39;</span>: 160,
174</span></span><span style=display:flex><span> <span style=color:#a31515>&#39;T&#39;</span>: 180, <span style=color:green># is D</span>
175</span></span><span style=display:flex><span>}
176</span></span><span style=display:flex><span>
177</span></span><span style=display:flex><span><span style=color:#00f>with</span> open(<span style=color:#a31515>&#34;quote.fa&#34;</span>) <span style=color:#00f>as</span> f:
178</span></span><span style=display:flex><span> sequence = f.read().replace(<span style=color:#a31515>&#39;</span><span style=color:#a31515>\n</span><span style=color:#a31515>&#39;</span>, <span style=color:#a31515>&#39;&#39;</span>)
179</span></span><span style=display:flex><span>
180</span></span><span style=display:flex><span><span style=color:#00f>for</span> nucleotide <span style=color:#00f>in</span> [char <span style=color:#00f>for</span> char <span style=color:#00f>in</span> sequence]:
181</span></span><span style=display:flex><span> print(<span style=color:#a31515>&#34;Playing nucleotide </span><span style=color:#a31515>{}</span><span style=color:#a31515> with MIDI note </span><span style=color:#a31515>{}</span><span style=color:#a31515>&#34;</span>.format(
182</span></span><span style=display:flex><span> nucleotide, nucleotide_midi_map[nucleotide]))
183</span></span><span style=display:flex><span> send_note(nucleotide_midi_map[nucleotide], 127)
184</span></span><span style=display:flex><span>
185</span></span><span style=display:flex><span><span style=color:#00f>del</span> player
186</span></span><span style=display:flex><span>pygame.midi.quit()
187</span></span></code></pre><p><video src=/posts/dna-synthesized/elektron/elektron.mp4 controls></video><p>All of this could be made much more interesting if I choose different
188instruments for different Nucleotides, or doing more funky stuff with Elektron.
189But for now, this should be enough. It is just a proof of concept. Something to
190play around with.<h2 id=going-even-further>Going even further</h2><p>As you probably notice, the end results are quite similar to each other. This is
191to be expected because we are operating only with 4 notes essentially. What
192could make this more interesting is using something like
193<a href=https://supercollider.github.io/>Supercollider</a> to create more interesting
194sounds. By transposing notes or using effects based on repeated data in a
195sequence. Possibilities are endless.<p>It is really astonishing what can be achieved with a little bit of code and an
196idea. I could see this becoming an interesting background soundscape instrument
197if done properly. It could replace random note generator with something more
198intriguing, biological, natural.<p>I actually find the results fascinating. I took some time and listened to this
199music of nature. Even though it's quite the same, it's also quite different.
200The subtle differences on repeat kind of creates music on its own. Makes you
201wonder. It kind of puts Occam’s Razor in its place. Nature for sure loves to
202make things as energy efficient as possible.</div></article></main><section><hr><h2>Posts from blogs I follow around the net</h2><ul><li><a href=https://utcc.utoronto.ca/~cks/space/blog/linux/NFSv4ServerLockClients target=_blank rel=noopener>Finding which NFSv4 client owns a lock on a Linux NFS(v4) server</a> — <a href=https://utcc.utoronto.ca/~cks/space/blog/>Chris's Wiki :: blog</a><div>A while back I wrote an entry about finding which NFS client owns
203a lock on a Linux NFS server, which turned
204out to be specific to NFS v3 (which I really should have seen coming,
205since it involved NLM and lockd). Finding the NFS v4 client that
206owns a lock is, depending on your perspective, either simpl…<li><a href=http://www.landley.net/notes-2023.html#28-10-2023 target=_blank rel=noopener>October 28, 2023</a> — <a href=http://www.landley.net/notes-2023.html>Rob Landley's Blog Thing for 2023</a><div>Oh good grief, two of my least favorite licensing people, Larry Rosen
207and Bradley Kuhn, are interacting on the OSI's license-discuss
208list where the're doing
209bad computer history and insisting that a guy Larry Rosen
210coincidentally interviewed for a book years ago is clearly the origin of
211somethin…<li><a href="http://offbeatpursuit.com:80/blog/?id=25" target=_blank rel=noopener>A fix by any other name</a> — <a href=http://offbeatpursuit.com:80/blog/>WLOG - blog</a><div>tags:
212i2c, plan9
213Another month, another file system.
214Well, if you can’t fix it in software, fix it in hardware (looking at
215you, bme680, we’re not
216done yet). The show must go on, as they say, and I would like my
217experiments to go on.
218So a “new” addition to the environmental sensor family connected to
219the h…<li><a href=https://mirzapandzo.com/next-image-url-parameter-is-valid-but-upstream-response-is-invalid target=_blank rel=noopener>Next/Image "url" parameter is valid but upstream response is invalid</a> — <a href=https://mirzapandzo.com/>Mirza Pandzo's Blog</a><div>Getting "url" parameter is valid but upstream response is invalid error with Next/Image on WSL2<li><a href=https://drewdevault.com/2023/10/13/Going-off-script.html target=_blank rel=noopener>Going off-script</a> — <a href=https://drewdevault.com>Drew DeVault's blog</a><div>There is a phenomenon in society which I find quite bizarre. Upon our entry to
220this mortal coil, we are endowed with self-awareness, agency, and free will.
221Each of the 8 billion members of this human race represents a unique person, a
222unique worldview, and a unique agency. Yet, many of us have the sam…<li><a href=https://szymonkaliski.com/writing/2023-10-02-building-a-diy-pen-plotter/ target=_blank rel=noopener>Building a DIY Pen Plotter</a> — <a href=http://github.com/dylang/node-rss>Szymon Kaliski</a><div>This article documents my learnings from designing and building a DIY Pen Plotter during the summer of 2023.
223My ultimate goal is to build my…<li><a href=https://neil.computer/notes/chart-of-accounts-for-startups-and-saas-companies/ target=_blank rel=noopener>Chart of Accounts for Startups and SaaS Companies</a> — <a href=https://neil.computer/>Neil Panchal</a><div>Accounting is fundamental to starting a business. You need to have a basic understanding of accounting principles and essential bookkeeping. I had to learn it. There was no choice. For filing taxes, your CPA is going to ask you for an Income Statement (also known as P/L statement). If<li><a href=https://journal.valeriansaliou.name/deploy-a-nomad-cluster-on-alpine-linux-with-vultr/ target=_blank rel=noopener>Deploy a Nomad Cluster on Alpine Linux with Vultr</a> — <a href=https://journal.valeriansaliou.name/>Valerian Saliou</a><div>After spending countless hours trying to understand how to deploy my apps on Kubernetes for the first time to host Mirage, an AI API service that I run, I ended up making myself a promise that the next app I work on would be using a more productive & simpler<li><a href=https://jcs.org/2023/10/25/wifi_da target=_blank rel=noopener>BlueSCSI Wi-Fi Desk Accessory 1.0 Released</a> — <a href=https://jcs.org/>joshua stein</a><div>BlueSCSI Wi-Fi Desk Accessory
2241.0 has been released:
225wifi_da-1.0.sit
226(StuffIt 3 archive)
227SHA256: ccfc9d27dd5da7412d10cef73b81119a1fec3848e4d1d88ff652a07ffdc6a69aSHA1: ff124972f202ceda6d7fa4788110a67ccda6a13a
228This is the initial public release of my BlueSCSI Wi-Fi Desk Accessory for
229classic MacOS.<li><a href=https://michael.stapelberg.ch/posts/2023-10-25-my-all-flash-zfs-network-storage-build/ target=_blank rel=noopener>My 2023 all-flash ZFS NAS (Network Storage) build</a> — <a href=https://michael.stapelberg.ch/>Michael Stapelbergs Website</a><div>For over 10 years now, I run two self-built NAS (Network Storage) devices which serve media (currently via Jellyfin) and run daily backups of all my PCs and servers.
230In this article, I describe my goals, which hardware I picked for my new build (and why) and how I set it up.
231Design Goals
232I use my netw…</ul><p>Generated with <a href=https://git.sr.ht/~sircmpwn/openring target=_blank rel=noopener>openring</a>.</section><footer><hr><p><big><strong>Want to comment or have something to add?</strong></big><p>You can write me an email
233at <a href=mailto:mitja.felicijan@gmail.com>mitja.felicijan@gmail.com</a> or
234catch up with me <a href=https://telegram.me/mitjafelicijan target=_blank>on Telegram</a>.<hr><p>This website does not track you. Content is made available under the <a href=https://creativecommons.org/licenses/by/4.0/ target=_blank rel=noreferrer>CC BY 4.0 license</a> unless
235specified otherwise. Blog is also available as <a href=/index.xml target=_blank>RSS feed</a>.</footer><script>
236 window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
237 </script><script defer src=/_vercel/insights/script.js></script> \ No newline at end of file