Step 7: Make Your Own

You can convert your own audio files into vector cutting paths in ten easy steps:

1.  Download Processing.

2.  Download Python 2.5.4.

3.  Download Audacity.

4.  Download the code from GitHub (you can download the zip file by clicking on the cloud button).  Unzip and open the folder called LaserCutRecord.

5.  Open an audio file of your choice with Audacity.  Go to Effect>Equalization and select RIAA.  Hit inverse and apply, you should now hear the higher frequencies of your track boosted.

6.  Go to Effect>Low Pass Filter... and apply an anti-aliasing filter (a fancy word for a low pass filter) to your audio.  You will have to choose the cutoff frequency according to the max sampling rate that you can get with your cutter.  For example, my laser cutter melts anything above 2.5kHz at 45rpm, so I set my anti-aliasing filter cutoff to this same frequency.  Set the drop off as high as possible, for me this was 48dB/octave, that way the filter will have a hard cutoff.

7.  Use Effect>Amplify to amplify the signal as much as you can without noticeable effects of clipping (you will be able to get away with some clipping, and remember this is not crystal clear audio anyway). You may also want to mess around with Effect>>Compressor.

8.  Make sure there are 2 sec of blank audio at the end of the track so that nothing gets clipped and keep the audio under 3:10.  File>Export this file and save it in the "LaserCutRecord" folder as a wav file. 

9.  Open the Python file called "wavtotxt".  Copy the file name of the file you just saved in the line:

             fileName = "your_file_name_here.wav"

Hit Run>RunModule, after a minute or two you will have a .txt file saved in the Record Generator folder.

10.  Open the Processing sketch.  Change the name of the import file in the Processing sketch to your txt file name:

             String filename = "your_file_name_here.txt";

Run the Processing sketch Sketch>Run.  The Processing sketch will output several files, none larger than 700KB (I found that larger files were crashing the laser cutter).  The last file will also contain the cut paths for the inner hole and outer edge of the record, you will need to set your laser cutter to cut these lines at a higher power, so that it cuts all the way through the material.  Another very important note about cutting these files - the reason I had to split each song up into five parts is because I found that files larger than 800KB would crash my laser.  When you are cutting out the sequential files, you MUST shut down the laser for a second to clear it's memory and then turn it back on before sending it a new 700KB file to cut, you will have problems if you forget this.

Once you've made cutting files, post them!  You can upload files in the comments by clicking on "Rich Editor."  Enjoy, and let me know if you have questions or need help getting this to work.  I've tested this process Mac OS using the latest version of Processing.  If you actually end up cutting your own record, please post the results in the comments, I'm really curious to see where this code ends up!

In case you are stuck trying to find a machine to cut your files, check this list of worldwide hackerspaces, these are places where anyone can go for little to no money and use tools in a collaborative work environment.  If you are in school, you might ask the engineering or art departments if they have a machine than can cut vector files.  Otherwise, I'd recommend checking out an online fabrication service such as Ponoko.  Some people even build their own laser cutters, there are many builds documented right here on Instructables, we're even giving one away in our Epilog Challenge.
<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: