In order to explore the current limits of 3D printing technology, I've created a technique for converting digital audio files into 3D-printable, 33rpm records and printed a few functional prototypes that play on ordinary record players.  Though the audio quality is low -the records have a sampling rate of 11kHz (a quarter of typical mp3 audio) and 5-6 bit resolution (less than one thousandth of typical 16 bit resolution)- the songs are still easily recognizable, watch the video above to see the process and hear what the records sound like.  Also check out my laser cut records, made on wood, paper, and acrylic.

This past year I've been posting a lot of audio projects, specifically, I've been experimenting with using relatively simple tools and techniques and very little memory to approximate and recreate digital audio signals.  A great example is my Arduino Vocal Effects Box, where I used an Arduino to perform realtime pitch-bending on an incoming audio signal.  Through these projects, I've learned that audio is a very resilient medium, it can take a fair amount of abuse (in the form of distortion and compression) while still maintaining most of the integrity of the original sound.  The key is as long as you loosely approximate the overall shape of an audio signal, the output will sound reasonably recognizable.  We have evolution to thank for this: as we hear audio, some complicated processing goes on in our brains that makes us very good at ignoring noise and focusing on the important pieces of information coming through.  We can work off of relatively few cues (sometimes these even include contextual or visual cues) to piece together mangled or noisy audio and make sense of it; this is how we are able to focus on one voice in crowded room or decipher a message sent over a cheap walkie talkie. 

This project was my first experiment extending this idea beyond electronics.  I printed these records on a UV-cured resin printer called the Objet Connex500.  Like most 3D printers, the Objet creates an object by depositing material layer by layer until the final form is achieved.  This printer has incredibly high resolution: 600dpi in the x and y axes and 16 microns in the z axis, some of the highest resolution possible with 3D printing at the moment.   Despite all its precision, the Objet is still at least an order of magnitude or two away from the resolution of a real vinyl record.  When I first started this project, I wasn't sure that the resolution of the Objet would be enough to reproduce audio, but I hoped that I might produce something recognizable by approximating the groove shape as accurately as possible with the tools I had. 

In this Instructable, I'll demonstrate how I developed a workflow that can convert any audio file, of virtually any format, into a 3D model of a record, and how I optimized these records for playback on a real turntable.  The 3D modeling in this project was far too complex for traditional drafting-style CAD techniques, so I wrote an program to do this conversion automatically.  It works by importing raw audio data, performing some calculations to generate the geometry of a record, and eventually exporting this geometry straight to a 3D printable file format.  Most of the heavy lifting is done by Processing, an open source programming environment that's often used for 2D and 3D graphics and modeling applications.  Here's a basic overview of my Processing algorithm:

use raw audio data to set the groove depth- parse through the raw audio data, this is the set of numbers that defines the shape of the audio waveform, and use this information to set the height of the bottom of a spiral groove.  This way, when a turntable stylus moves along the groove it will move vertically in the same path as the original waveform and recreate the original audio signal.
draw record and groove geometry- A 3D model is essentially a list of triangles arranged in 3D space to create a continuous mesh, use the data from the last step and some general record parameters (record diameter, thickness, groove width, etc) to generate the list of triangular faces that describes the record's shape and the detailed spiral groove inscribed on its surface.
export model in STL format- the STL file format is understood by all 3D printers, export the geometry calculated in the last step as an STL file.  To get Processing to export straight to STL, I used the ModelBuilder Library written by Marius Watz (if you are into Arduino/Processing and 3D printing I highly recommend checking this out, it works great).

I've uploaded some of my complete record models to the 123D gallery as well as the Pirate Bay.  Check Step 6 for a complete listing of what's there and what I plan on posting.  Alternatively, you can go to Step 7 to download my code and learn how to make printable record models from your own audio.

Special thanks to Randy Sarafan, Steve Delaire, Arthur Harsuvanakit, Phil Seaton, and Audrey Love for their help with this project.

Here's another video that gives a great overview of the printing process and shows the printers at work:

Step 1: How Does a Record Work?

The basic mechanism of a record player is very simple.  The record moves at a constant rotational speed (usually 33.3 or 45 rpm) and a needle (also called a stylus) moves along a long spiral groove cut into the record's surface.  As the record spins, the needle hits tiny bumps in the groove and vibrates to produce audio signals.  I won't get into the specifics of how the needle extracts data from the record, but it is really interesting and there's a great demo of it here

The record player and record cutter were invented by Edison in 1877.  Due to a lack of precise machinery and technique at the time, the grooves on the first records were much larger than those on modern microgroove records and, subsequently, the audio signals were much noisier.  This is a similar situation that I found myself in when starting this project: despite the high precision of the Objet machines, the resolution is nowhere near modern vinyl quality.  Here and here are two examples of Edison's first phonograph tests.  You can hear that the quality of recording of these tests is pretty close to what I've been able to 3d print; although I can't find the exact specs on these records, I'd imagine that the scale of the grooves was similar to what I was working with.

To give you an idea of the resolution of a modern record, check out the images above.  Figs 1-3 are from Chris Supranowitz, a researcher at The Institute of Optics at the University of Rochester.  These are close up images of a vinyl record, taken with an electron microscope.  The dark objects in figs 1 and 2 are tiny particles of dust.  Fig 3 is a bird's eye view of the record grooves, the darker regions are the top (uncut) surface of the record.

Fig 4 was made by branku62 at vinylengine.com, it shows the profile dimensions of a standard microgrove mono groove, this is what you would find on a modern mono 33 or 45 (stereo grooves are actually cut a bit smaller).  In the diagram 1 mil = 1/1000", which is about 25um.  Microgroove records require a stylus with a 0.7 to 1.0 mil radius tip, the tip makes contact with the groove at E in fig 1, a width of about 1.4 mil.  The total depth of the groove is around 1.1 mil.  These dimensions match up nicely with the dimensions of the electron microscope images.

Fig 5 is from Ron Geesin and Mark Berresford's website, it shows the groove depths of the older 78's.  These records were much more coarse than microgroove records, both the needle and grooves were about 3x as large in every dimension.  Fig 2 shows the groove depth for 78's was somewhere between 2.2 and 3.6 mil.  The stylus radius was around 2.7 mil.
<p>I received an email today from someone asking me about how far I managed to go with replicating Amanda's process, so I thought I'd share my experience in more details. </p><p>Note that this experience below occurred in December 2014.</p><p>My goal was to try print a 3mn song on 1 side of a 12 inches vinyl and see what is the best quality and output I could achieve, noticing that it has been already more than 2 years since Amanda did her project, so I assumed that the technology would have progressed rapidly.</p><p>Amanda's instructions and provided programs help you generate the binary file, then create a 3D model (STL file) for a one sided vinyl with that song on it (eq'd specifically for vinyl previously as per the video). At this stage, I don't know if you can even generate a two sided vinyl STL model but this didn't matter to me for that experience. </p><p>I downsampled the file to 12hz as per her initial instructions and default settings. The outcome was a file that was 700MB. Generating this file alone requires HUGE amount of processing power. Note that I'm using a Mac Book Pro with 16GB of ram, solid state drive and a very powerful processor. It was nevertheless a painful process for the computer to generate the file. See attached an image of the model. You'll note that the entire surface is not covered, which I couldn't quite figure out why. I assumed that if it did take the entire width, the grooves would be a be bigger and therefore more tolerant to the level of precision currently available via 3D printing.</p><p>I then tried changing the downsampling rate to something higher (I started at 24hz), so I could get to a quality closer to what I'm after (i.e. that can be released). It looked something like this:</p><p>Unfortunately, the file couldn't even get generated. My computer would hang permanently. That wasn't even trying 44hz which is what I was ideally after...</p><p>To note: the output STL file had dimensions for X and Y initially rendering in mm instead of inches for some reason so something to keep an eye out on if you try that technique using Amanda's program (unless it had to do with the program I used to render the shape - I then had to update the dimensions manually to the equivalent in mm).</p><p>I stuck to my 12hz downsampling rate then and contacted the most advanced 3D printing company in Melbourne I could find (3Dsystems.com). They had by very far the best machines I could find on the market for once off printing. I figured this would provide me already with a significant improvement of quality from what Amanda had produced.</p><p>The machine used was SLA Flex Printer with XHD 0.050 mm layers. Resolutions were uniform on all 3 axis, XYZ with all parts having an accuracy of 0.001 &ndash; 0.002 inch per inch of part dimension. This was by far the best printer I could find. The material used was 'Accura Xtreme'.</p><p>Unfortunately, the machine and vinyl would break before it could be fully printed, the file being far too large. Files are generraly a few dozens MB at most, and Amanda herself mentions that 300MB is already pushing it. </p><p>Doing some further research, I then thought that the model may be using a lot of polygons which are not required to print all the details. I therefore asked Amanda if she thought we could use a technique called decimation to remove useless polygons and therefore make the file lighter, but she confirmed that the program she created was pretty efficient. Considering how precise vinyls are in terms of geometry, this makes perfect sense. <br></p><div>Note that the price quoted to me was about US$250 for 1 copy (price goes down obviously as you order more). Copy of the quote attached.</div><div><p>As of today, there therefore doesn't seem to be a way to print even one single song in a decent quality. The song I used was just below 3mn and in mp3 format.</p><p>I'm not sure whether there are elements I could have tweaked to change the output (type of printer or material used, settings in the file), but it seemed that as of early 2015, we were still a long way to being able to 3D print vinyls from the comfort of our home, or as an alternative manufacturing process to the vinyl plants (which was the main goal of my investigation here). </p><p>If anyone has tried similar experiences and maybe had better outcomes, I'd love to hear about it.</p><p>Cheers, Charly</p></div>
<p>Phew! Don't give up! I managed to get it to work after some trial and error and re-reading the instructions. Most of my problems came about from using different versions of Windows. I found I could only get it to work on my desktop, not my laptop.</p>
<p>thanks for posting this, lots of good info here.</p>
<p>Hello Amanda!</p><p>I represent a national touring band that wants to talk with you about your 3D printed vinyl concept. They want to release plans for people to print a new song for record store day. I'd love to have a quick chat about how feasible this may be and if you'd ever be interested in working with us? Or perhaps recommending someone to work with as I'm sure you're very busy...All the best to you!</p><p>Vance Anderson<br>vanderson7@me.com</p>
<p>Here's an interesting question to put to you and the community. How could the Processing Code be modified to generate the groove on a cylinder, instead of a flat record. I&quot;m doing a bit of material research for a class and want to try 3D printing working phonograph cylinders. Your record printing seems to be in line with what I&quot;m trying to do, but I'm not sure how to go about generating the file. Any suggestions or insite would be appreciated. </p>
<p>In<br>addition, this 3D printer has a dual extrusion having a closed environment. It includes a sliding door that simplyprovides you withaccess to your prints.<br> <br><a href="https://www.allthat3d.com/cheap-3d-printer/" rel="nofollow">Allthat3D.com/Cheap-3D-Printer/</a></p>
<p>Hello Amanda,</p><p>The vinyl 3D generate with record generator as somme error.</p><p>when i repair the STL with Slic3r there are a probleme of layer. How resolve this probleme and use the STL to gcode.</p><p>Do you have this probleme to print the STL?</p>
<p>Hello Amanda,</p><p>I resolve my probleme and i made it.</p><p>Could you tel me de good parameter for a rmp 33.3</p><p>I have take the following parametter an i have a little disque. 11.8 m x 11.8 m</p><p>rpm = 33.3;//rev per min<br>float secPerMin = 60;//seconds per minute<br>float rateDivisor = 4;//how much we are downsampling by<br>float theta;//angle variable<br>float thetaIter = (samplingRate*secPerMin)/(rateDivisor*rpm);//how many values of theta per cycle<br>float radius;//variable to calculate radius of grooves<br>float diameter = 11.8;//diameter of record in inches<br>float innerHole = 0.286;//diameter of center hole in inches<br>float innerRad = 2.35;//radius of innermost groove in inches<br>float outerRad = 5.75</p><p>many thanks.</p>
<p>draw record and groove geometry Looks awesome</p><p>Thanks in advance</p>
<p>Good project</p><p>I did not find the program or code to do the following (i download the processing 3 softwar):</p><p>- draw record and groove geometry</p><p>- export model in STL format (the link is break)</p><p>could you help me to made your project,</p><p> </p>
thank for your repy
<p>Dear Amanda,<br>Thanks for this brillant project.</p><p>Is there any way to use it as sort to get something more extruded, more like a sculpture?</p><p>I'm thinking about these prints made from different songs (http://www.realitat.com/microsonic/portishead.html)</p><p></p>
<p>Good post. I learn some thing tougher on distinct blogs everyday. Most commonly it really is stimulating to learn to read content material from other writers and exercise a specific thing there.</p><p><a href="http://enablerslove.tumblr.com/" rel="nofollow">http://enablerslove.tumblr.com/</a></p>
<p>First off, you've got bloody good taste in music. Thank you for not printing any Beatles tracks . . . that would be fine, but . . .</p><p>Next, I'm shocked you can hear anything at all printing this stuff. It's fascinating. Obviously the higher the frequency, the higher the resolution needed. Prints of older music containing less fidelity will naturally sound closer to what we're used to hearing, due to the lack of upper harmonics. </p><p>At any rate, what I'm really wondering here is, someone needs to write a new slicer, or whatever software, that can route the printer in circles. I clearly hear the &quot;sawing&quot; of the needle traversing the lines that are created by the printhead going at 90&ordm; angles all the time. Shouldn't we be trying to print this stuff in a spiral? Just a thought. The resolution requirements would actually be less if the material were deposited in a spiral. The resolution requirements of printing curves using only right angles is far beyond where we're at for now.</p><p>Thoughts?</p>
<p>This is incredible! I am trying to do this with my own music, however the 3d printer i have access to can only print an area 8in wide. I tried changing the processing code to reflect that and it failed. Any advice what needs to change to shrink the diameter of the 3d model? I really want to try this!</p>
<p>Thats exceptional...</p>
<p>Awesome! If you do a 7&quot; 45, both the resolution could be higher (pickup moves past more groves per time) and the files smaller/easier to generate, right? Experimented with any 45 rpms?</p>
<p>Ah, of course the quality is lower at 7&quot; than at the outer edges of a <br>12&quot; anyway. But still interested in your progress, if you ever did try <br>with RIAA eq, higher RPMs etc.</p>
<p>Ah, of course the quality is lower at 7&quot; than at the outer edges of a 12&quot; anyway. But still interested in your progress, if you ever did try with RIAA eq, higher RPMs etc.</p>
<p>I love learning new and interesting things ...<br> and this web is full of this.<br> Thank you very much for sharing knowledge and continue to do so</p>
Is this possible to make on Ultimaker? Can I make the vinyl 5&quot; and can I make muliple short tracks on it ? Sorry for all the questions but you got me all excited lol
<p>@Amanda Ghassaei</p><p>Hello. Have you ever considered to use GPU computing? That might be helpful for sound processing on my opinion.</p>
<p>Incredible. A little info off topic- as far as I know Kurt Cobain hated Nevermind, the album which contains Smells Like Teen Spirit. He hated this song even more. The reasons he stated: the album sounded too perfect and clean, much unlike Nirvana's first album. He felt they had sold out. I wonder what he would say if he heard how Smess like teen spirit sounds on this record. :D</p>
<p>Learned some cool things in this tutorial, thank you.</p>
<p>This is such a cool program! But I am having trouble running the processing sketch. It says</p><p>&quot;No library found for unlekker.util</p><p>No library found for unlekker.modelbuilder</p><p>No library found for ec.util</p><p>Libraries must be installed in a folder named 'libraries' inside the 'sketchbook' folder.&quot;</p><p>I tried putting the files in a bunch of different folders but non of them seemed to work. Any thoughts?</p>
<p>I have the same trouble! Any way to fix it?</p>
<p>the modelbuilder library isn't in the right folder.</p><p>this project uses the same library, see if following the instructions from the top comment helps you:</p><p>https://www.instructables.com/id/3D-Printed-Photograph/</p>
<p>this is simply amazing! I can't believe it's printed!</p>
<p>Hey guys,</p><p>I had an issue with the python script that kept sending me this error: IndexError: list index out of range</p><p>If you run into the same issue this fixed it:</p><p>Just add this line right below: for i in range(numframes):</p><p> if len(frameInt)&gt;=(4*i+1):</p><p>Cheers,</p><p>Leart</p>
<p>What a creative technology 3D printing. Btw, can I made iPhone with 3D printing machine?</p>
<p>This is incredible. I'm impressed at how far 3D printing has gone. Someday most of our items will be 3d printed, I assume. What do you think?</p>
<p>Hi Amanda, I just sent you an e-mail regarding a film shoot inquiry. Can you please check your gmail and let me know what you think? Thank you~</p>
The problem seems to be in the nature of the printer output design. I think a much simpler solution would be to develop a printer that printed a long line for the audio then use a separate device that rolled it into a record like a really short but very thick jelly roll. I don't know if my idea makes sense but basically you'd be printing and then rolling a line of sound into a record format. I don't know of any type of printer that does this though or if one could even be made. It just seems that printing it all at once as a single object is where the problem with audio quality is coming from.
<p>Thank you for all what they offer</p>
<p>I have just showed this to my cousin and the reaction was ... @#!</p>
<p>Hi, Amanda, great project. Can you tell me how can i make a sound loop record?</p>
<p>Smells like teen spirit is a timeless song. And that record is so cool. Great job.</p>
<p>I like your work </p>
<p>Hi, this is a really great tutorial but I ran into a problem when trying to find the &quot;wavtotxt&quot; file on Python. Since Python has updated I wondered if it had been removed or possibly i just couldn't find it. I would really like to know how you found it as I was hoping to use this as a part of a project.</p><p>Thanks</p>
<p>Hey Amanda,</p><p>This is a very cool project, with detailed instructions. I work for a Computer Science Dept. at a University, and one of our Media Studies classes would would like to do this with some audio they created, and were very excited when they discovered your instructable. We have an Ultimaker 2. Since the print bed is only 8&quot; I figured it would make more sense to print a 7&quot; - 45. Using your code isn't a problem, but I am having some problems with how the changes affect the audio. I've also be unable to determine what the dpi for the Ultimaker 2 is. I know it's capable of printing 20 micro layers, but I'm not sure what xy values you use to determine it, when it's not published. I've posted the top of my processing file below, and was hoping you could give me an idea of how to modify the audio and groove parameters.</p><p>On another note, the slicing software for the Ultrimaker displays in mm rather then inches (and doesn't convert, which is annoying). If I wanted to do all the calculations in mm would I just need to change the record dimensions at the top and the scaling factor (which you've set to 25400 micros per inch) near the bottom, or is there something I'm missing.</p><p>Thanks so much</p><p>//record parameters</p><p>float diameter = 6.9;//diameter of record in inches</p><p>float innerHole = 0.286;//diameter of center hole in inches</p><p>float innerRad = 2.125;//radius of innermost groove in inches</p><p>float outerRad = 3.31;//radius of outermost groove in inches</p><p>float recordHeight = 0.06;//height of top of record (inches)</p><p>int recordBottom = 0;//height of bottom of record</p><p>//audio parameters</p><p>float samplingRate = 44100;//(44.1khz audio initially)</p><p>float rpm = 45;//rev per min</p><p>float rateDivisor = 4;//how much we are downsampling by</p><p>//groove parameters</p><p>float amplitude = 24;//amplitude of signal (in 16 micron steps)</p><p>float bevel = 0.5;//bevelled groove edge</p><p>float grooveWidth = 2;//in 600dpi pixels</p><p>float depth = 6;//measured in 16 microns steps, depth of tops of wave in groove from uppermost surface of record</p><p>//printer parameters</p><p>float dpi = 600;//objet printer prints at 600 dpi</p><p>float micronsPerLayer = 20;//microns per vertical print layer</p>
<p>Hi,</p><p>the x/y resolution for the Ultimaker is going to be dependent on the thickness of the extruded plastic coming out the nozzle. I suspect an Ultimaker will probably be too low res to get anything interesting to print unfortunately - closer to 60dpi rather than 600. Maybe try the laser cut records?</p><p>https://www.instructables.com/id/Laser-Cut-Record/</p><p>You're right about converting to mm.</p>
Hi Amanda ! This is a really amazing work you made here ! Congratulation ! <br>I tried to make my own 3D model with processing but I have some trouble with step 10. &quot;Change the name of the import file in the Processing sketch to your txt file name: String filename = &quot;your_file_name_here.txt&quot;;&quot; <br> <br>Should we write &quot;String filename = &quot;your_file_name_here.txt&quot;;&quot; in the text editor of Processing or make file&gt;open and open the .txt file ? <br> <br>Thanks in advance for your advices !
cool, glad to hear you're messing with the code! I just changed that line to whatever the name of my file was. so if I had a file called daftpunk.txt, I changed the line to read:<br /><br />String filename = "daftpunk.txt";<br /><br />does that make sense?
<p>Hello Amanda - I understand this Question was answer 2 years ago - but here I am asking the same question. </p><p>I have created the &quot;myfile.txt&quot; file through Python programming. But now trying to &quot;import the data within 'myfile.txt' file&quot; into Processing, and then also where should I be typing &quot;String filename = &quot;myfile.txt&quot;; ... Everytime I run Processing, all I get is a Grey 'java' box appear with nothing happening?</p><p>Any suggestions you may have?</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: