A few months back, I wrote about how I used a 3D printer to transform any mp3 into a physical record.  Though all the documentation for that project is available here, and the 3D models could potentially be printed through an online fabrication service, I knew that the barrier to entry for normal people interested in trying out the process themselves was prohibitively high.  With this project I wanted to try to extend the idea of digitally fabricated records to use relatively common and affordable machines and materials so that (hopefully) more people can participate, experiment, and actually use all this documentation I've been writing.

These records were cut on an Epilog 120 Watt Legend EXT to a theoretical precision of 1200dpi (the kerf of the cut and some tricks I used to avoid crashing the laser cutter dropped the actual precision down by ~1/6).  The audio on the records has a bit depth between 4-5 (typical mp3 audio is 16 bit) and a sampling rate up to about 4.5kHz (mp3 is 44.1kHz).  So far I've successfully cut audio on wood (figs 1-2), acrylic (figs 3-4), and paper (figs 5-6), and I'm sure there are many more materials that would work.  I wrote the Processing sketch that generates the record cutting paths so that it can be modified for any song, material, cutting machine, record size, and turntable speed (skip ahead to download the code and learn how to make your own records).

You should also note that in this Instructable I'll demonstrate specifically how I used a laser cutter for this process, but the cutting files I'm using are standard vector graphics in a PDF format, so they can be extended to many other digital fabrication tools. For example, I'm curious to see if it's possible to use a CNC mill or a CNC razor blade paper cutter with my cutting files (a group of people were able to cut out some sine waves on paper using a Cameo in this Instructable).

Below are some of my final results, read on to see how they were made and how you can make your own.

Joy Division - Love Will Tear Us Apart on clear acrylic (download vector files):

Radiohead - Idioteque on wood (download vector files):

The Velvet Underground and Nico - Femme Fatale on maple (download vector files):

Step 1: How Does a Record Work?

I've explained a bit about how a record works and the scale of vinyl microgrooves in my 3d printed record project.  The main difference between these laser cut records and my 3d printed records is the axis that the grooves are cut on.  Since I can't control the power of the laser while it is cutting a vector path, the laser cut records are cut laterally on the surface of the material.  This means that the needle only vibrates in the plane parallel to platter of the turntable.  The 3d printed records are "cut" vertically, meaning the needle vibrates in the plane perpendicular to the platter.  I chose to modulate the grooves vertically for the 3d printed records because the vertical axis is the most precise axis on the machine (resolution of 16 microns).

Stereo (2 channel) vinyl records are cut both vertically and laterally, this way it's possible for two isolated channels of audio to fit into one groove.  Mono vinyls are cut laterally only, this is because the vertical cuts can become distorted, especially if you try to increase the amplitude of your waveform to increase the dynamic range of the sound.  Although I didn't really have a choice in the matter, it's better to to cut a mono groove laterally.

To give you an idea of the size of the grooves on a modern record, check out the image above from Chris Supranowitz, a researcher at The Institute of Optics at the University of Rochester.  This is a close up image of a vinyl record, taken with an electron microscope.  The dark objects in the grooves are tiny particles of dust.  The laser cutter cannot make such precise cuts because the width of the beam is too large, so the grooves on my records are about 1-2 orders of magnitude larger in every dimension than these grooves.
<p>hi amanda, hi community</p><p>attached you see two screenshots from the same .pdf. the more complete looking one is preview/acrobat the smaller one comes from illustrator. anybody? solutions or explainations? </p><p>hugs</p><p>cc</p>
<p>Hey,</p><p>Just wanted to pin this comment to the top since lots of people are running into it. the problem is that illustrator doesn't like to import so much data at once, so it cuts it off. You need to break your data into smaller chunks to import.</p><p>If you look at the processing code:</p><p><a href="https://github.com/amandaghassaei/LaserCutRecord/blob/master/LaserCutRecord.pde">https://github.com/amandaghassaei/LaserCutRecord/b...</a></p><p>there's a variable called </p><p><strong>numGroovesPerFile</strong></p><p>lower this number so that you export more files with fewer grooves on each (maybe 7 is a good place to start, but you may need to go lower). Once you make the chunks of data small enough, you will be able to import the files into illustrator without loosing anything.</p><p>Hope that helps!</p>
hi amanda, <br><br>thanks a lot. i reuced the numgroovesperfile down to 5. it worked now. couldn&acute;t believe it. thanks for pointing out the importance of it.<br><br>will post the results here soon.
<p>Hi Amanda,</p><p>I'm having trouble getting python to find my file. Here is the test and a screen shot.</p><p>Thank You!</p><p>Best,</p><p>C</p>#this code unpacks and repacks data from:#16 bit stereo wav file at 44100hz sampling rate#to:##16 bit mono wav file at 44100hz sampling rateimport waveimport mathimport structbitDepth = 8#target bitDepthfrate = 44100#target frame ratefileName = &quot;space.wav&quot;#file to be imported (change this)#read file and get dataw = wave.open(fileName, 'r')numframes = w.getnframes()frame = w.readframes(numframes)#w.getnframes()frameInt = map(ord, list(frame))#turn into array#separate left and right channels and merge bytesframeOneChannel = [0]*numframes#initialize list of one channel of wavefor i in range(numframes): frameOneChannel[i] = frameInt[4*i+1]*2**8+frameInt[4*i]#separate channels and store one channel in new list if frameOneChannel[i] &gt; 2**15: frameOneChannel[i] = (frameOneChannel[i]-2**16) elif frameOneChannel[i] == 2**15: frameOneChannel[i] = 0 else: frameOneChannel[i] = frameOneChannel[i]#convert to stringaudioStr = ''for i in range(numframes): audioStr += str(frameOneChannel[i]) audioStr += &quot;,&quot;#separate elements with commafileName = fileName[:-3]#remove .wav extensiontext_file = open(fileName+&quot;txt&quot;, &quot;w&quot;)text_file.write(&quot;%s&quot;%audioStr)text_file.close()
<p>Amanda, this is amazing. I will try it.</p>
<p>Hi All,</p><p>So I'm trying to create a record for a project and I'm having trouble during the final step, processing. The image attached shows an uncompleted pdf that processing has made, the song i chose is around 3 minutes long. So I decided to try 30 seconds of music, put in processing, but unfortunately it's showing the exact same pdf. Is it how I'm preparing the .wav file on audacity that's causing the problem? Or I'm wondering if the problem is because I'm using the updated version of python and if that's the case, can anyone help me get python 2.5.4 because I'm also having trouble trying to download it. Or if anyone has python 2.5.4, can you help me create the .txt file so I can put that into processing. </p><p>thanks in advance!</p>
<p>Hi All,</p><p>I've installed everything and followed the instructions but for some reason I can't get the python code to 'see' the wav file. I've tried several different file names and moving thing in and out of the root folder etc but it won't run. I'm using Win 10 so i've tried the latest version which doesn't even open and then tried the older version which runs but won't see the file when i've changed the file name in the code.</p><p>Thanks in advance for any help! </p>
<p>hmm that is really strange. What is the error message? usually I just run the code with the wav in the same folder.</p>
<p>Hej Amanda, </p><p>Thank you for your great work and the detailed instructions - I studied it a while ago with great interest. When I stumbled over the &quot;new&quot; HD Vinyl thing, this instructable came back into my mind (see picture). Do you think they are able to patent their &quot;3D-based topographical mapping&quot; (http://www.digitalmusicnews.com/2016/03/15/high-definition-vinyl-will-soon-become-a-reality/) which corresponds in general to your work three years ago? Unfortunately, the patent document is currently not available but I wonder if they applied the same methodology as you did.</p><p>What do you think?</p>
Hi Amanda, very cool work. I had a question about making longer records. What prevents you from making albums longer than 3 minutes? Is it the material or the size of the laser cutter/What are the limitations that prevent you from being able to cut an entire album? <br><br>Also is it possible to adjust the RPM if you want to do something other than 45rpm? <br><br>Thank you!
<p>Hey Community,</p><p>I've done old school Edison style record carving, but would love to do this for an upcoming project. Would love to pay someone to help me out. In the bay area.</p><p>Thanks, </p><p>Tim</p>
<p>Hi Amanda, </p><p>can you think is it possible to cut a full album on a face ?</p>
no, the spacing of the grooves is too large to cut more than a few min.
<p>How do I open the processing sketch??</p>
<p>hi amanda, hi community</p><p>I'm having issues w/ getting the laser cutter to recognize all the .pdfs - It only cuts the final .pdf (the one w/ the cut lines), which prints the groves great. The laser cutter recognizes the files, but when I hit 'go' on the cutter, it immediately says 'Done'. As read in previous posts, I've tried the following to no avail:</p><p>- I've restarted the laser cutter and resent.<br>- I've changed the 'minDist' to prevent cutter stall<br>- I've included the cut lines (inner circle/outer circle) in with other grove .pdfs</p><p>Can't seem to figure out why it cuts the groves in the last file, but not any other ones. Any thoughts?</p><p>Below is a pic of the final file where it included the groves - no other grove files will cut.</p>
<p>really weird. Maybe it has something to do with your print settings on certain colors? or maybe the line thickness? what kind of laser are you using?</p>
<p>line thickness is .001 (hairline). i've tried changing the color settings (both in the print output and changing the color of the vector paths), and experimented w/ all the available color variables one by one. I resorted to running a new set of .pdfs and keep getting the same thing - it prints only the final .pdf. (I am printing them individually. I've included the final .pdf (#13 - with the cut lines) along with a couple of other .pdfs (the ones that won't print). I'm using a Epilog Laser Mini 30w. it is weird that one file will print, but not the others.</p>
<p>ok - i think i have this figured out. !!! i set the 'numGroovesPerFile' down to 5 - It puts out 27 files instead of 13. It printed the last file (of course), but it also printed every file under 100k. It looks like ~100k is my cutoff point (my inner rings are 89k, my outer rings are 129k - 169k). My outer rings won't print, but inner rings print fine. The reason that my final file was the only one to print on previous tests, is that it was the only file under 100k. I'm going to keep experimenting. Thanks, Amanda!!!</p>
<p>Hi all,<br><br>I have a 30 sec. ~2 mb wav from Audacity.<br>I get this error in phyton:<br></p><p>Traceback (most recent call last):</p><p> File &quot;wavtotext.py&quot;, line 26, in &lt;module&gt;</p><p> frameOneChannel[i] = frameInt[4*i+1]*2**8+frameInt[4*i]#separate channels an</p><p>d store one channel in new list</p><p>IndexError: list index out of range</p><p><br>What can be wrong?</p>
<p>Problem solved. I used a mono wav file. Converted stereo and it worked.</p>
<p>Hi Amanda! I don't know anything about code and I'm getting this error in the last step in processing (sketch&gt;run).... any ideas??</p><p>Thanks!!!</p>
<p>Jordan, did you solve your problem? Because I'm getting the same error message. </p>
No I haven't.... The best I can figure it out is that there's never a definition for the value &quot;section&quot;. I'm not really sure how to fix it... I'm fairly sure I had followed the directions well up until this point.
<p>ok, I took a look at it, I think you guys are using a newer version of processing. It's not happy that variables are used in the following line:</p><p>size(int(cutterWidth*scaleNum),int(cutterHeight*scaleNum));</p><p>an easy fix is to just set the width and height as static numbers. So for example if are using:</p><p>int cutterWidth = 100;//width of laser cutter bed in inches </p><p>int cutterHeight = 50;//height of laser cutter bed in inches</p><p>float scaleNum = 72.0;//scale factor of vectors (default 72 dpi)</p><p>then </p><p>cutterWidth*scaleNum = 100*72 = 7200</p><p>and </p><p>cutterHeight*scaleNum = 50*72 = 3600</p><p>so you should replace the size() line with:</p><p>size(7200,3600);</p><p>Also Michael, I don't think you are using the newest version of the code, find it here:</p><p>https://github.com/amandaghassaei/LaserCutRecord</p>
<p>Thanks, Amanda!</p><p>I'm using the newest version of the code, and used your suggested fix of using static numbers and it worked!!</p><p>I do have a new problem, though. The sketch runs and produces a .pdf w/ the lines - but the .pdf closes immediately (opens for not quite a full second). I've restarted the computer to clear out any bad juju, but it still happens. Any thoughts on that one?</p><p>I'm using Processing 3.0.1 - newest one updated in October. Is there a legacy version that would work better?</p>
<p>Hi Amanda, Nevermind on the .pdf questions above. I found them all in the LaserCutRecord folder.</p><p>Now off to playing w/ lasers!!</p><p>Thanks so much!</p>
<p>not sure, is your txt file in the right folder? check the lines that use the size() function, the error is happening on one of those lines.</p>
<p>Here's the txt file i created!</p>
<p>I suppose it could be in the wrong folder- when I open the file called &quot;LaserCutRecord.pde&quot; it gives me this error asking me to create a folder. When I first unzip the file the structure looks like this, but this is where I've copied files once it creates the folder. </p>
<p>Hi Amanda - I'm super excited about this code, but I'm running into the same error message as Jordan above. My .wav, .txt., .pde files are all in the same folder. The error is in line 66. Any thoughts? (my image is above in the reply to Jordan)</p>
<p>This is an amazing project, cant wait to try it. I cant find any mention of it, but how long does it take to laser one record?</p>
<p>1.5hrs, this could be sped up a lot, but the laser cutter gets stuck on the high density of the points in these paths unfortunately.</p>
<p>Hi Amanda and community,<br>I study architecture and I'm doing a project at the University of Technology in Graz, Austria (the one without kangaroos :P ). I just printed it out as several .pdf files, can't wait to try it out on lasercutter tomorrow.<br>Thank you a lot for the codes and instructions</p>
<p>Hi Amanda, (in regards to the laser cut record project) I'm having some trouble because when I send the files to be cut on the laser cutter, the laser cutter messes up. Is there any reason why this is happening?</p><p>Thank you.</p><p>Kind regards</p>
You'll have to be a little more specific, what does "messes up" mean? Can you upload a photo?
Sure, sorry I'll attach the photos. I did two test runs with the velvet underground song, the first one (black record) was fine up until the end when stopped following the vector paths. The second test was with the white-ish material, the laser cutter didn't even cut the circle right from the start. Pictures are attached :)
<p>did you end up getting it to work?</p>
<p>Yes I got it working! Thank you so much, I look forward to more instructables from you!</p>
Sure, sorry heres two test ones I ran. The first one came out the way it should until it got to the end and thats the black record. The white-ish record just messed up from the start, it wouldn't cut the circle properly.
<p>wow I've never seen this before. what model is the lase cutter? Maybe try increasing the number </p><p>minDist </p><p>to 8 or 9 and see if that does anything. It's at the top of this file:</p><p><a href="https://github.com/amandaghassaei/LaserCutRecord/blob/master/LaserCutRecord.pde">https://github.com/amandaghassaei/LaserCutRecord/b...</a></p><p>that will space out individual points on the vector path a little more. I found that if they were too close together my laser would just stop. The behavior you're seeing is very strange, but maybe related.</p>
<p>I got it to work!!! (digitally anyways)</p><p>This is amazing. Now my laser cutter just has to be delivered...</p><p>Here are the first 3 min of &quot;The General&quot; by Dispatch</p>
<p>cool, hope it works!</p>
I'm having a bit of an issue running the processing sketch. <br> <br>Processing crashes when I load the split strings into this array. My .txt file is 43mb. Which seems gigantic for a plain text. But at 44100 x 180~ sec. I guess that makes some sense. <br> <br>it's this line that causes the sketch to run out of memory. I've changed my processing prefs to allocate 512MB but it still crashes. I suppose I'm confused, or not doing something right, as no one else has posted this issue... <br> <br> float audioData[] = float(split(rawDataString,',')); //separated by commas <br> <br>any thoughts?
<p>Having the same issue with roughly the same size txt file, the original song was 3.10 minutes long. Can anyone give me any tips on what i'm doing wrong?</p>
<p>can you post the text file? click on "add images" when you leave a comment, it will let you upload a file.</p>
<p>interesting, I haven't seen that one before. can you upload your txt file? (use the "add images" button)</p>
<p>Does anyone have any suggestions for making a straight line (instead of a circular record shape) with this? </p>
<p>Just put in an empty sound file, that should work. The sound waves are made by the &quot;wiggles&quot; so anything with no sound would just be a regular curve.</p>
<p>Oh, no, sorry for the confusion - I meant, I'd like to take the audio and plot it along a straight line, rather than curved as a record..Is it possible to do that with this Processing code? I'm not very good with equations..</p>

About This Instructable




Bio: I'm a grad student at the Center for Bits and Atoms at MIT Media Lab. Before that I worked at Instructables, writing code for ... More »
More by amandaghassaei:OTCA Metapixel - Conway's Game of Life "9 Degrees of Freedom" IMU Twitter Controlled Pet Feeder 
Add instructable to: