3D Printed Record (5 / 8 steg)

Steg 5: Initial Audio tester (featuring The Pixies)



Slutligen var det dags att börja skriva ut verkliga ljud! Alla mina ursprungliga ljud tester gjordes med de första 30 sekunderna från inledande spåret av en av de bästa albumen som någonsin skrivits, The Pixies "Debaser."

I det första testet använde jag samma parametrar att jag hade haft tur med i sinus våg testerna:

amplitud: 16 x 16 micron z axel steg
Groove bredd: 2px
Groove djup: 3 x 16 micron z axel steg
Samplingsfrekvens: 11,025hz (en fjärdedel av normal mp3 samplingsfrekvens)

groove avstånd: 20 pixlar (med 600 dpi)

Min bearbetning koden är nedan. Koden är kraftigt kommenterade, men här är den övergripande:
En ljudfil är i grunden en lista med tal som rita en kurva över tiden. De data som jag drog från Python i det sista steget är just det, listan över datapunkter i ljudfilen. I huvudsak var vad jag gjorde i denna bearbetning skiss använda dessa data för att ange djupet för en lång, spiral räfflar på postens yta. Senare kommer att när nålen passerar över denna groove, dess spets följa denna väg och faktiskt spåra ut ursprungliga vågformen lagras i audio data.

txt att stl - 3d utskrivbara konverteringsposten
av Amanda Ghassaei
Dec 2012

/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/

import processing.opengl.*;
import unlekker.util.*;
import unlekker.modelbuilder.*;
import ec.util.*;

Snöre arkivnamnen = "debaser.txt";

UVertexList recordPerimeterUpper, recordPerimeterLower, recordHoleUpper, recordHoleLower, //storage för omkrets och centrum hål för posten
UVertexList lastEdge; //storage för conecting en groove till nästa
UGeometry geo, //storage för stl geometri

parametrar
flyta samplingRate = 44100; / / (44,1 hz ljud)
flyta rpm = 33.3;//rev per minut
flyta secPerMin = 60. //seconds per minut
flyta rateDivisor = 4; //how mycket vi är nedsampling av
float theta; //angle variabel
flyta thetaIter = (samplingRate * secPerMin) /(rateDivisor*rpm); //how många värden av theta per cykel
float radie; //variable att beräkna radien av spår
float diameter = 11.8;//diameter av post i tum
flyta innerHole = 0.286;//diameter av centrumhål i tum
flyta innerRad = 2.35;//radius av innersta spår i tum
flyta outerRad = 5.75;//radius av yttersta groove i tum
flyta grooveSpacing = 20; //pixel avståndet mellan spåren

spela in parametrar
flyta recordHeight = 0.04;//height för posten i tum
int recordBottom = 0; //height av botten av post

variabla parametrar
flyta amplitud = 24; //amplitude av signal (i 16 micron steg)
float avfasning = 0.5;//bevelled groove kant
flyta grooveWidth = 3; //in 600dpi pixlar
flyta djup = 6; //measured i 16 mikrometer steg, skärpedjup toppar av våg i spåret från den översta yta på posten

flyta incrNum = TWO_PI/thetaIter; //calculcate kantiga incrementation belopp

int grooveNum = 0; //variable för att hålla reda på hur lång tid detta tar
int totalSampleNum;

void setup() {

Geo = nya UGeometry (); //place att lagra geometery för verticies

setUpVariables (); //convert enheter, initiera etc
setUpRecordShape (); //draw grundform av posten
drawGrooves(processAudioData()), //draw i spår

geo.writeSTL (här, filnamn + ".stl");//write stl-fil från linlär

Exit();
}

flyta [] processAudioData() {

få data ur txt-fil
Sträng \Data [] = loadStrings(filename);
String rawDataString = \Data [0];
flyta audioData [] = float(split(rawDataString,',')); //separated med kommatecken

normalisera ljuddata gett bitdjupet
först hitta max val
flyta maxval = 0;
för (int jag = 0; jag < audioData.length; i ++) {
om (abs(audioData[i]) > maxval) {
maxval = abs(audioData[i]);
}
}
normalisera amplitud till max val
för (int jag = 0; jag < audioData.length; i ++) {
audioData [i] * = amplituden/maxval;
}

returnera audioData;
}

void setUpVariables() {

omvandla allt till inches
flyta micronsPerInch = 25400; //scalingfactor
float dpi = 600;
byte micronsPerLayer = 16. //microns per vertikal utskrift lager

grooveSpacing = dpi;
amplitud = amplitud * micronsPerLayer/micronsPerInch;
djup = djup * micronsPerLayer/micronsPerInch;
grooveWidth = dpi;

}

void setUpRecordShape() {

ställa in lagring
recordPerimeterUpper = ny UVertexList();
recordPerimeterLower = ny UVertexList();
recordHoleUpper = ny UVertexList();
recordHoleLower = ny UVertexList();

få verticies
för (theta = 0; theta < TWO_PI; theta += incrNum) {
yttre kanten av posten
flyta perimeterX = diameter/2+diameter/2*cos(theta);
flyta perimeterY = diameter/2+diameter/2*sin(theta);
recordPerimeterUpper.add(perimeterX,perimeterY,recordHeight);
recordPerimeterLower.add(perimeterX,perimeterY,recordBottom);
centrumhål
flyta centerHoleX = diameter/2+innerHole/2*cos(theta);
flyta centerHoleY = diameter/2+innerHole/2*sin(theta);
recordHoleUpper.add(centerHoleX,centerHoleY,recordHeight);
recordHoleLower.add(centerHoleX,centerHoleY,recordBottom);
}

nära vertex listor (slutna slingor)
recordPerimeterUpper.close();
recordPerimeterLower.close();
recordHoleUpper.close();
recordHoleLower.close();

ansluta verticies
geo.quadStrip(recordHoleUpper,recordHoleLower);
geo.quadStrip(recordHoleLower,recordPerimeterLower);
geo.quadStrip(recordPerimeterLower,recordPerimeterUpper);

för att starta, är yttre kanten av post den sista egde vi måste ansluta till med yttersta räffla
lastEdge = ny UVertexList();
lastEdge.add(recordPerimeterUpper);

println ("post dras, start fåror");
grooveNum = 0; //variable för att hålla reda på hur mycket längre det kommer att ta

}

void drawGrooves (float [] audioData) {

UVertexList grooveOuterUpper, grooveOuterLower, grooveInnerUpper, grooveInnerLower; //groove verticies
UVertexList stop1, stop2; //storage för början och slutet av sprial groove

ställa in lagring
grooveOuterUpper = ny UVertexList();
grooveOuterLower = ny UVertexList();
grooveInnerUpper = ny UVertexList();
grooveInnerLower = ny UVertexList();
stop1 = nya UVertexList();
stop2 = ny UVertexList();

DRA SPÅR
radie = outerRad; //outermost radie (på 5,75") att starta
flyta radIncr = (grooveSpacing + grooveWidth) / thetaIter; //calculate radiella incrementtion belopp
int samplenum = 0;
int totalgroovenum = int(audioData.length/(rateDivisor*thetaIter));

första bytet börjar cap
theta = 0;
flyta sineTheta = sin(theta);
flyta cosineTheta = cos(theta);
beräkna höjden av groove
flyta grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];
stop1.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight), //outerupper
stop2.Add ((diameter/2 + radie * cosineTheta), (diameter/2 + radie * sineTheta), grooveHeight), //outerlower
stop2.Add ((diameter / 2 + (radius-grooveWidth) * cosineTheta), (diameter / 2 + (radius-grooveWidth) * sineTheta), grooveHeight), //innerlower
stop1.Add ((diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * cosineTheta), (diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * sineTheta), recordHeight), //innerupper
Rita trianglar
geo.quadStrip(stop1,stop2);

sedan spiral räfflar
medan (radie > innerRad & & rateDivisor * samplenum < (audioData.length-rateDivisor*thetaIter+1)){//while vi har fortfarande ljud att skriva och vi har inte nått den innersta groove

Rensa listor
grooveOuterUpper.reset();
grooveOuterLower.reset();
grooveInnerUpper.reset();
grooveInnerLower.reset();

för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi

sineTheta = sin(theta);
cosineTheta = cos(theta);

beräkna höjden av groove
grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];
samplenum ++; //increment prov num

grooveOuterUpper.add((diameter/2+(radius+amplitude*bevel)*cosineTheta),(diameter/2+(radius+amplitude*bevel)*sineTheta),recordHeight);
grooveOuterLower.add((diameter/2+radius*cosineTheta),(diameter/2+radius*sineTheta),grooveHeight);
grooveInnerLower.add((diameter/2+(radius-grooveWidth)*cosineTheta),(diameter/2+(radius-grooveWidth)*sineTheta),grooveHeight);
grooveInnerUpper.add((diameter/2+(radius-grooveWidth-amplitude*bevel)*cosineTheta),(diameter/2+(radius-grooveWidth-amplitude*bevel)*sineTheta),recordHeight);

RADIUS--= radIncr;

}

lägga till sista värdet i spåren att slutföra en fullständig rev
theta = 0;
sineTheta = sin(theta);
cosineTheta = cos(theta);

beräkna höjden av groove
grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];

grooveOuterUpper.add((diameter/2+(radius+amplitude*bevel)*cosineTheta),(diameter/2+(radius+amplitude*bevel)*sineTheta),recordHeight);
grooveOuterLower.add((diameter/2+radius*cosineTheta),(diameter/2+radius*sineTheta),grooveHeight);
grooveInnerLower.add((diameter/2+(radius-grooveWidth)*cosineTheta),(diameter/2+(radius-grooveWidth)*sineTheta),grooveHeight);
grooveInnerUpper.add((diameter/2+(radius-grooveWidth-amplitude*bevel)*cosineTheta),(diameter/2+(radius-grooveWidth-amplitude*bevel)*sineTheta),recordHeight);

ansluta verticies
geo.quadStrip(lastEdge,grooveOuterUpper);
geo.quadStrip(grooveOuterUpper,grooveOuterLower);
geo.quadStrip(grooveOuterLower,grooveInnerLower);
geo.quadStrip(grooveInnerLower,grooveInnerUpper);

Ange nya sista kanten
lastEdge.reset (); //clear gamla data
lastEdge.add(grooveInnerUpper);

komplett början cap vid behov
om (grooveNum == 1) {
Rensa stop2
stop2.Reset();
stop2.Add (diameter/2 + diameter/2 * cosineTheta, diameter/2 + diameter/2 * sineTheta, recordHeight); //outer omkrets [0]
stop2.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight); //outer groove kant [2pi]
Rita trianglar
geo.quadStrip(stop1,stop2);
}

berätta för mig hur mycket längre
grooveNum ++;
Print(grooveNum);
skriva ut ("av");
Print(totalgroovenum);
println ("spår dras");
}

Rita ändlock av spiral räfflar
stop1.Reset();
stop2.Reset();
stop1.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight), //outeruppter
stop2.Add ((diameter/2 + radie * cosineTheta), (diameter/2 + radie * sineTheta), grooveHeight), //outerlower
stop2.Add ((diameter / 2 + (radius-grooveWidth) * cosineTheta), (diameter / 2 + (radius-grooveWidth) * sineTheta), grooveHeight), //innerlower
stop1.Add ((diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * cosineTheta), (diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * sineTheta), recordHeight), //innerupper
Rita trianglar
geo.quadStrip(stop1,stop2);
stop2.Reset();
stop2.Add(grooveInnerUpper.First()), //innerupper [0]
stop2.Add (diameter/2 + innerHole/2 * cosineTheta, diameter/2 + innerHole/2 * sineTheta, recordHeight); //innerhole [0]
Rita trianglar
geo.quadStrip(stop1,stop2);

geo.quadStrip (lastEdge, recordHoleUpper); //close återstående utrymmet mellan sista groove och centrumhål

}

och här är resultatet:

Framgång! Du kan tydligt höra The Pixies kommer igenom, men signal-brus-förhållande är inte bra. I min nästa test förstärkt jag ursprungliga ljudsignalen lite innan det skickas till min bearbetning skiss. Sätt några av avsnitten starkare trumma skulle få något klippt och tillåta totala amplituden av normaliserade signalen för att få lite större. Här är vad det låter som:

Signal till brus blir bättre, jag la lite mer ljud till denna fil så att du kan börja att höra Frank Black sång kommer in. Nästa ökat jag amplituden av signalen för att se om jag kunde få en bättre signal. I mina sine tester trodde jag att en amplitud på 16 var mycket högt, men inte så stort att det orsakade överdriven snedvridning i signalen. Sedan Pixies signalen inte är alltid som spänner över hela amplituden tillåts av mitt program ökat jag amplituden av algoritmen (mesta vågformen svävar omkring hälften av dess maximal amplitud, bara trummor är kunna sparka signalen upp till full amplitud). Detta kan orsaka några extra snedvridning på trumslag, men eftersom trummor redan ganska bullriga jag var ok med det. Här är resultatet av amplitud 32:

Signal till brus är bättre, men det finns en hel del distorsion. Jag minskade amplituden till 24 nästa:

Detta låter mycket bättre. Bra signal till brus utan för mycket distorsion. Därefter gjorde jag en liten edit till min kod för att minimera mängden data packas in i stl-fil. I de tidigare exemplen skapade jag lite utrymme mellan spåren, i princip en Planslipmaskiner parallell till toppen av posten. I koden nedan jag bort detta utrymme och den sista övre kanten av den tidigare groove som den övre kanten av nästa räffla. Skillnaden i modellen visas i figur 2.

txt att stl - 3d utskrivbara konverteringsposten
av Amanda Ghassaei
Dec 2012

/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*/

import processing.opengl.*;
import unlekker.util.*;
import unlekker.modelbuilder.*;
import ec.util.*;

Snöre arkivnamnen = "bluemonday.txt";

UVertexList recordPerimeterUpper, recordPerimeterLower, recordHoleUpper, recordHoleLower, //storage för omkrets och centrum hål för posten
UVertexList lastEdge; //storage för conecting en groove till nästa
UGeometry geo, //storage för stl geometri

parametrar
flyta samplingRate = 44100; / / (44,1 khz ljud)
flyta rpm = 33.3;//rev per minut
flyta secPerMin = 60. //seconds per minut
flyta rateDivisor = 4; //how mycket vi är nedsampling av
float theta; //angle variabel
flyta thetaIter = (samplingRate * secPerMin) /(rateDivisor*rpm); //how många värden av theta per cykel
float radie; //variable att beräkna radien av spår
float diameter = 11.8;//diameter av post i tum
flyta innerHole = 0.286;//diameter av centrumhål i tum
flyta innerRad = 2.35;//radius av innersta spår i tum
flyta outerRad = 5.75;//radius av yttersta groove i tum

spela in parametrar
flyta recordHeight = 0.04;//height för posten i tum
int recordBottom = 0; //height av botten av post

variabla parametrar
flyta amplitud = 24; //amplitude av signal (i 16 micron steg)
float avfasning = 0.5;//bevelled groove kant
flyta grooveWidth = 2. //in 600dpi pixlar
flyta djup = 6; //measured i 16 mikrometer steg, skärpedjup toppar av våg i spåret från den översta yta på posten

flyta incrNum = TWO_PI/thetaIter; //calculcate kantiga incrementation belopp

int grooveNum = 0; //variable för att hålla reda på hur lång tid detta tar
int totalSampleNum;

void setup() {

Geo = nya UGeometry (); //place att lagra geometery för verticies

setUpVariables (); //convert enheter, initiera etc
setUpRecordShape (); //draw grundform av posten
drawGrooves(processAudioData()), //draw i spår

geo.writeSTL (här, filnamn + ".stl");//write stl-fil från linlär

Exit();
}

flyta [] processAudioData() {

få data ur txt-fil
Sträng \Data [] = loadStrings(filename);
String rawDataString = \Data [0];
flyta audioData [] = float(split(rawDataString,',')); //separated med kommatecken

normalisera ljuddata gett bitdjupet
först hitta max val
flyta maxval = 0;
för (int jag = 0; jag < audioData.length; i ++) {
om (abs(audioData[i]) > maxval) {
maxval = abs(audioData[i]);
}
}
normalisera amplitud till max val
för (int jag = 0; jag < audioData.length; i ++) {
audioData [i] * = amplituden/maxval;
}

returnera audioData;
}

void setUpVariables() {

omvandla allt till inches
flyta micronsPerInch = 25400; //scalingfactor
float dpi = 600;
byte micronsPerLayer = 16. //microns per vertikal utskrift lager

amplitud = amplitud * micronsPerLayer/micronsPerInch;
djup = djup * micronsPerLayer/micronsPerInch;
grooveWidth = dpi;

}

void setUpRecordShape() {

ställa in lagring
recordPerimeterUpper = ny UVertexList();
recordPerimeterLower = ny UVertexList();
recordHoleUpper = ny UVertexList();
recordHoleLower = ny UVertexList();

få verticies
för (theta = 0; theta < TWO_PI; theta += incrNum) {
yttre kanten av posten
flyta perimeterX = diameter/2+diameter/2*cos(theta);
flyta perimeterY = diameter/2+diameter/2*sin(theta);
recordPerimeterUpper.add(perimeterX,perimeterY,recordHeight);
recordPerimeterLower.add(perimeterX,perimeterY,recordBottom);
centrumhål
flyta centerHoleX = diameter/2+innerHole/2*cos(theta);
flyta centerHoleY = diameter/2+innerHole/2*sin(theta);
recordHoleUpper.add(centerHoleX,centerHoleY,recordHeight);
recordHoleLower.add(centerHoleX,centerHoleY,recordBottom);
}

nära vertex listor (slutna slingor)
recordPerimeterUpper.close();
recordPerimeterLower.close();
recordHoleUpper.close();
recordHoleLower.close();

ansluta verticies
geo.quadStrip(recordHoleUpper,recordHoleLower);
geo.quadStrip(recordHoleLower,recordPerimeterLower);
geo.quadStrip(recordPerimeterLower,recordPerimeterUpper);

för att starta, är yttre kanten av post den sista egde vi måste ansluta till med yttersta räffla
lastEdge = ny UVertexList();
lastEdge.add(recordPerimeterUpper);

println ("post dras, start fåror");
grooveNum = 0; //variable för att hålla reda på hur mycket längre det kommer att ta

}

void drawGrooves (float [] audioData) {

UVertexList grooveOuterUpper, grooveOuterLower, grooveInnerUpper, grooveInnerLower; //groove verticies
UVertexList stop1, stop2; //storage för början och slutet av sprial groove

ställa in lagring
grooveOuterUpper = ny UVertexList();
grooveOuterLower = ny UVertexList();
grooveInnerUpper = ny UVertexList();
grooveInnerLower = ny UVertexList();
stop1 = nya UVertexList();
stop2 = ny UVertexList();

DRA SPÅR
radie = outerRad; //outermost radie (på 5,75") att starta
flyta radIncr = (grooveWidth + 2 * kant * amplitud) / thetaIter; //calculate radiella incrementation belopp
int samplenum = 0;
int totalgroovenum = int(audioData.length/(rateDivisor*thetaIter));

första bytet börjar cap
theta = 0;
flyta sineTheta = sin(theta);
flyta cosineTheta = cos(theta);
beräkna höjden av groove
flyta grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];
stop1.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight), //outerupper
stop2.Add ((diameter/2 + radie * cosineTheta), (diameter/2 + radie * sineTheta), grooveHeight), //outerlower
stop2.Add ((diameter / 2 + (radius-grooveWidth) * cosineTheta), (diameter / 2 + (radius-grooveWidth) * sineTheta), grooveHeight), //innerlower
stop1.Add ((diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * cosineTheta), (diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * sineTheta), recordHeight), //innerupper
Rita trianglar
geo.quadStrip(stop1,stop2);

sedan spiral räfflar
medan (radie > innerRad & & rateDivisor * samplenum < (audioData.length-rateDivisor*thetaIter+1)){//while vi har fortfarande ljud att skriva och vi har inte nått den innersta groove

Rensa listor
grooveOuterUpper.reset();
grooveOuterLower.reset();
grooveInnerUpper.reset();
grooveInnerLower.reset();

för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi

sineTheta = sin(theta);
cosineTheta = cos(theta);

beräkna höjden av groove
grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];
samplenum ++; //increment prov num

om (grooveNum == 0) {
grooveOuterUpper.add((diameter/2+(radius+amplitude*bevel)*cosineTheta),(diameter/2+(radius+amplitude*bevel)*sineTheta),recordHeight);
}
grooveOuterLower.add((diameter/2+radius*cosineTheta),(diameter/2+radius*sineTheta),grooveHeight);
grooveInnerLower.add((diameter/2+(radius-grooveWidth)*cosineTheta),(diameter/2+(radius-grooveWidth)*sineTheta),grooveHeight);
grooveInnerUpper.add((diameter/2+(radius-grooveWidth-amplitude*bevel)*cosineTheta),(diameter/2+(radius-grooveWidth-amplitude*bevel)*sineTheta),recordHeight);

RADIUS--= radIncr;

}

lägga till sista värdet i spåren att slutföra en fullständig rev
theta = 0;
sineTheta = sin(theta);
cosineTheta = cos(theta);

beräkna höjden av groove
grooveHeight = recordHeight-depth-amplitude+audioData[int(rateDivisor*samplenum)];

om (grooveNum == 0) {
grooveOuterUpper.add(grooveInnerUpper.first());//grooveOuterUpper.add((diameter/2+(radius+amplitude*bevel)*cosineTheta),(diameter/2+(radius+amplitude*bevel)*sineTheta),recordHeight);
}
grooveOuterLower.add((diameter/2+radius*cosineTheta),(diameter/2+radius*sineTheta),grooveHeight);
grooveInnerLower.add((diameter/2+(radius-grooveWidth)*cosineTheta),(diameter/2+(radius-grooveWidth)*sineTheta),grooveHeight);
grooveInnerUpper.add((diameter/2+(radius-grooveWidth-amplitude*bevel)*cosineTheta),(diameter/2+(radius-grooveWidth-amplitude*bevel)*sineTheta),recordHeight);

ansluta verticies
om (grooveNum == 0) {//if att gå med en roove till kanten av posten
geo.quadStrip(lastEdge,grooveOuterUpper);
geo.quadStrip(grooveOuterUpper,grooveOuterLower);
}
annat {//if att gå ett spår till ett annat spår
geo.quadStrip(lastEdge,grooveOuterLower);
}
geo.quadStrip(grooveOuterLower,grooveInnerLower);
geo.quadStrip(grooveInnerLower,grooveInnerUpper);

Ange nya sista kanten
lastEdge.reset (); //clear gamla data
lastEdge.add(grooveInnerUpper);

komplett början cap vid behov
om (grooveNum == 0) {
Rensa stop2
stop2.Reset();
stop2.Add (diameter/2 + diameter/2 * cosineTheta, diameter/2 + diameter/2 * sineTheta, recordHeight); //outer omkrets [0]
stop2.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight); //outer groove kant [2pi]
Rita trianglar
geo.quadStrip(stop1,stop2);
}

berätta för mig hur mycket längre
grooveNum ++;
Print(grooveNum);
skriva ut ("av");
Print(totalgroovenum);
println ("spår dras");
}

Rita ändlock av spiral räfflar
stop1.Reset();
stop2.Reset();
stop1.Add ((diameter / 2 + (radie + amplitud * avfasning) * cosineTheta), (diameter / 2 + (radie + amplitud * avfasning) * sineTheta), recordHeight), //outeruppter
stop2.Add ((diameter/2 + radie * cosineTheta), (diameter/2 + radie * sineTheta), grooveHeight), //outerlower
stop2.Add ((diameter / 2 + (radius-grooveWidth) * cosineTheta), (diameter / 2 + (radius-grooveWidth) * sineTheta), grooveHeight), //innerlower
stop1.Add ((diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * cosineTheta), (diameter / 2 + (radius-grooveWidth-amplitud * avfasning) * sineTheta), recordHeight), //innerupper
Rita trianglar
geo.quadStrip(stop1,stop2);
stop2.Reset();
stop2.Add(lastEdge.last()), //innerupper [0]
stop2.Add (diameter/2 + innerHole/2 * cosineTheta, diameter/2 + innerHole/2 * sineTheta, recordHeight); //innerhole [0]
Rita trianglar
geo.quadStrip(stop1,stop2);

geo.quadStrip (lastEdge, recordHoleUpper); //close återstående utrymmet mellan sista groove och centrumhål

}

Och här är vad det låter som:

Jag var riktigt nöjd med hur detta kom ut, detta är koden jag använde går framåt.

Se Steg
Relaterade Ämnen

3D tryckt Motion Replicator & Recorder robotarm för varma sommardagar

Jag ville alltid bygga en 3 DOF arm som kan styras med sin kopia. Med Arduino & 3D var utskrift det ganska lätt. Jag hoppas du kan enkelt byggt denna robot genom att följa dessa 8 steg. Vänligen Glöm inte att titta på och dela demovideo som jag spela...

Vulcanus V1 Reprap 3D-Printer 300€

HejI denna anvisning ska jag visa dig hur man gör en mycket professionel 3D skrivare med en låg Bugdet för mindre än 300€.Jag är 16 år gammal och jag gjorde allt själv. "Vulcanus V1" - 3D - skrivaren är baserad på CoreXY. Som står för hög precis...

Vara en detektiv: Finger Print och fot Print fånga och analys

Hej det här är en enkel Instructable på hur man fångar fingeravtryck och fotspår med objekt lätt tillgängliga i marknaden. :)Forensisk vetenskap är tillämpningar av ett brett spektrum av vetenskaper att svara på frågor av intresse för ett rättssystem...

Barock Alto Recorder i F

I denna första instructables skriver jag jag som täcker alla Detaljer för att skriva ut, efterbearbetningen och montera detta fullt fungerande alto recorder. Brännaren kan skrivas i alla standard RepRap skrivaren eller hem tryckeri som ultimaker elle...

Block och Bar Vinyl Record renare

om du är in vinylskivor och du får din på samma ställen jag gör, på loppmarknader, varvet försäljning och Goodwill, du vet hur frustrerande de "snap, crackle och dyker" kan vara. Försöker få decennier gammal damm och crud som orsakar dessa ljud...

3D lentikulär skriva med Photoshop och inkjet printer

3D lentikulär print är ett sätt att presentera 3D-effekt på en plan yta. Tanken är att använda en plastfolie med många fodrad linser så att ljuset kommer att vara bryts i olika vinklar för ögonen vänster och höger. När en bild bakom lentikulär bladet...

Hawaiian Print Skateboard grafik

Super söt aloha grafik (utan stökigt dyra serigrafi) är möjligt med några enkla material.Du behöver:1 rulle "flyttbara" kontakt papper (kallas även hylla liner)Exacto knivKarbonpapperSprayfärgPennaSharpieScotch tejpEn utskrift av hawaiian grafik...

3D tryckta BATON - 100% 3D tryckt - utskrifter i en PRINT - redan har monterats - enda EXTRUDER - ingen stöder

DENNA STAFETTPINNE SKRIVS UT I EN TRYCKT, MED EN ENDA EXTRUDER, OCH UTAN STÖD ELLER FLOTTE... DE FLESTA SKRIVARE KOMMER ATT KUNNA SKRIVA UT DET GANSKA ENKELTHär är en video av mig förklara stafettpinnen:ÖVERSIKT:Detta är en stafettpinne som jag desig...

Google Cloud Print Setup att skriva ut från vilken dator

I den här videon kommer jag visa dig hur man ställer in Google Cloud Print till dig på en dator med hjälp av Googles Chrome webbläsare. Du kan också använda någon android driv anordning att skicka filer och skriva ut....

3D pulver Print slutade med Zap CA

Hur efterbearbetningen och försegla Z-Corp 3D utskrifter för styrka samtidigt behålla färg och finish närmast till den ursprungliga pulver tryckta vita.Utforska parametrisk modellering, jag konstruerade ett stycke som heter "Metatron's Cube" som...

Paw Print hund behandla burk

Stash hundens favorit behandlar i denna söta och färgglada paw print burk! Här är den bästa delen: du kan använda diskmaskin Mod Podge på den och placera i diskmaskin eller Skölj bort i diskhon!Steg 1: Ta ditt materialHär är vad du behöver att göra d...

DIY-SLS-3D-Printer

I denna anvisning vill jag visa dig hur man bygger en DIY Selektive-Laser Sintring (SLS) 3D-skrivare. Jag är 17 år gammal och gjorde allt själv. Sedan 6 månaden min stora dröm var att bygga upp en fungerande SLS-3D-skrivare, men det finns ett problem...

Veckla upp 01: Projektion på Print

Projektion på Print120 x 120 cm duk + 3 minuter om / V slingaDigital skulptur studierVeckla upp serien är ett pågående form experiment inspirerad av fenomenet morfogenes (från grekiska, "början av formen", den biologiska process som orsakar en o...

Grimgarn av Archimedes - 3D Print

Detta är en mer avancerad version av grimgarn av Archimedes jag postat förra veckan. Eftersom detta är ovanför min träbearbetning färdigheter, jag tog den lätta vägen och 3D tryckta design. Alla STP och STL-filer ingår i det sista steget för nedladdn...

RECORDER stöd verktyg

2007 Jan förlorat sin vänstra pekfingret i en såg olycka, men detta hindrade inte honom fortsätter sin hobby som musiker. Tvärtom, lärde Jan sig spela brännaren igen med modifierade grepp och balans i sin dominerande hand. Förutom det började han akt...

Vinyl Record ramar

Det sorgligaste med tillkomsten av digital musik kan vara förlusten av skivomslag. 12 "X 12" är en vinyl albumet ärm rätt storlek och andel vara ett konstverk som är värda att hänga i ett galleri. Jag gjorde dessa vinyl record ramar att visa min...

Cherry - 60€ 3D-Printer

Hej, i denna anvisning, kommer att jag visa dig hur man gör en 3D-skrivare för mindre än 60€ (kanske den billigaste i världen)Jag är 16 år gammal och jag gjorde allt själv.Denna 3D-skrivare, fungerar med billigaste motorerna på marknaden (28Byj-48),...

3D Printing ditt Zbrush Sculpts

3D Printing ditt Zbrush Sculpts: Jag gjorde det på TechShop (http://techshop.ws)!Detta instructable kommer att förklara processen för att ta ett ZBrush verktyg och, med hjälp av både decimering befälhavaren och 3D skriva ut exportören plugins, samt M...

3D Printed Pokemon`s

Tack för att kolla min första någonsin instructable, skapad för 3D utskrift tävling. Jag kommer att visa dig den process som används för att skapa en låg poly-count 3D tryckta pokemon som du kan hämta och 3D-print!För mig är en av de häftigaste saker...