3D Printed Record (5 / 8 steg)
Steg 5: Initial Audio tester (featuring The Pixies)
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.