Laser Cut Record (4 / 7 steg)
Steg 4: Audio tester på akryl
Låten är Kärlek kommer att slita oss ifrån varandra av Joy Division. Min favorit av alla poster jag 3d tryckt var definitivt Glädjeuppdelning en (låten sjukdom), jag gillar läskiga vibe snedvridningen ger det.
Denna laser skurna joy division spår är inte riktigt där ännu (även om anständigt igenkännligt). Du kan höra mycket av krispighet på trumslag, om du kunde titta noga på posten, skulle du se att dessa områden av kickfrekvenser var smält i glömska av klipparen. I detta försök gjorde jag inte något försök att ange en max frekvens av nedskärningar och hårdare nedskärningarna krävs av dessa avsnitt tydligen orsakade lasern att dröja alltför länge på materialet.
Jag lärde mig några saker om laserskärare från detta försök. Den första par försök jag gjorde på denna nedskärning orsakade lasern att frysa upp nästan omedelbart. Först trodde jag att jag överbelasta maskinen med data, men sedan insåg jag att maskinen inte gillar att få extremt tät vektorbanor. I själva verket fann jag att om två punkter på en vektorbana inom ca 6 pixlar av varandra, laser kommer att sluta. Jag var tvungen att ändra min kod för att ta hänsyn till detta. Här är bearbetning koden jag använde:
ljud tester
av Amanda Ghassaei
Jan 2013
/*
* 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.pdf.*;
parametrar
Snöre arkivnamnen = "lovewilltearusapart.txt";
flyta rpm = 33,3;
flyta samplingRate = 44100;
float dpi = 1200; //dpi Cutter
flyta amplitud = 16. //in pixlar
int frekvens = 500, //cycles per rotation
flyta avstånd = 10; //space mellan spåren (i bildpunkter)
float minDist = 6.0;//min pixel avstånd mellan punkter i vektorbana (att förhindra cutter flippar ut) 0.25919998
float diameter = 11.8;//diameter av post i tum
flyta innerHole = 0.286;//diameter av centrumhål i tum
flyta innerRad = 5;//2.2;//radius av innersta spår i tum
flyta outerRad = 5.75;//radius av yttersta groove i tum
booleska cutlines = false;
konstanter
flyta secPerMin = 60.
int scaleNum = 72. //scale faktor av vektorer (standard 72 dpi)
lagring för en given punkt i spåret
float radCalc;
float xVal;
float yVal;
float theta; //angle variabel
flyta thetaIter = samplingRate/2 * secPerMin/rpm, //how många värden av theta per cykel
float radie; //variable att beräkna radien av spår
flyta xValLast = 0,0;
flyta yValLast = 0,0;
void setup() {
println(thetaIter);
size(36*scaleNum,24*scaleNum);
beginRecord (PDF, filnamn + ".pdf");//save som PDF
bakgrund (255); //white bakgrund
noFill (); //don't fyllning loopar
strokeWeight (0,001); //hairline bredd
skalan pixel avstånd
amplitud = amplituden/dpi * scaleNum;
minDist = minDist/dpi * scaleNum;
mellanrum = avstånd/dpi * scaleNum;
Rita sinusvågor
flyta incrNum = TWO_PI/thetaIter; //calculcate kantiga inrementation belopp
flyta radIncrNum = (2 * amplitud + avstånd) / thetaIter; //radial incrementation belopp
radie = outerRad * scaleNum; //calculate yttersta radie (på 5,75")
stroke (255,0,0), //red
beginShape();
//Draw tyst Spårets yttre
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
//calculate ny punkt
radCalc = radie;
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
//Store sista koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
// }
RADIUS--= radIncrNum; //decreasing radie former spiral
// }
flyta [] songData = processAudioData();
int numGrooves = 0;
heltal index = 0;
medan (radie > innerRad * scaleNum) {
int numpoints = 0;
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
radCalc = radie + songData [index];
index + = 2;
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
numpoints ++;
}
RADIUS--= radIncrNum; //decreasing radie former spiral
}
numGrooves ++;
println(numGrooves);
println(numpoints);
}
endShape();
om (cutlines) {
Rita skära linjer (100 enheter = 1")
stroke (0), //draw i svart
ellips (bredd/6, höjd/4, innerHole * scaleNum, innerHole * scaleNum); //0.286 "centrumhål
ellips (bredd/6, höjd/4, diameter * scaleNum, diameter * scaleNum); //12 "diameter ytterkanten
}
endRecord();
Exit();
berätta för mig när det är över
println("finished.");
}
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;
}
Som med 3d tryckta, drog jag den råa ljuddata från det ursprungliga wav-fil i Python innan det skickas till behandling, att koden kan hittas här. Och igen, om någon vet ett sätt att kringgå detta steg, du gärna lämna en kommentar, jag skulle mycket hellre hålla allt på bearbetning.
I min nästa test satt jag en gräns på vinkelavståndet mellan på varandra följande punkter, hoppas att minimera smältning av materialet. Här är koden:
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist) & & radCalc*abs(thetaLast-theta) > minAngDist) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
thetaLast = theta;
numpoints ++;
}
.. .och videon:
Snittet kom ut mycket renare, och du kan höra betydligt mindre distorsion på audio, men jag trodde jag kunde fortfarande göra det bättre. I nästa test jag in prover per varv till en konstant nummer (6000) och bort minsta vinkelavstånd logiken från min kod.
På 6000 prover per cykel är samplingsfrekvensen för ljud:
prover/SEK = prover/varv * varv/min * min/SEK
prover/SEK = 6000 * 45 * 1/60 = 4,5 kHz
Här är koden:
ljud tester
av Amanda Ghassaei
Jan 2013
/*
* 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.pdf.*;
parametrar
Snöre arkivnamnen = "lovewilltearusapart.txt";
flyta rpm = 33,3;
flyta samplingRate = 44100;
float dpi = 1200; //dpi Cutter
flyta amplitud = 16. //in pixlar
flyta avstånd = 10; //space mellan spåren (i bildpunkter)
float minDist = 6.0;//min pixel avstånd mellan punkter i vektorbana (att förhindra cutter flippar ut) 0.25919998
float diameter = 11.8;//diameter av post i tum
flyta innerHole = 0.286;//diameter av centrumhål i tum
flyta innerRad = 5;//2.2;//radius av innersta spår i tum
flyta outerRad = 5.75;//radius av yttersta groove i tum
booleska cutlines = false; //cut de inre och yttre omkrets
konstanter
flyta secPerMin = 60.
int scaleNum = 72. //scale faktor av vektorer (standard 72 dpi)
lagring för en given punkt i spåret
float radCalc;
float xVal;
float yVal;
float theta; //angle variabel
flyta thetaIter = 6000; //how många värden av theta per cykel
float radie; //variable att beräkna radien av spår
flyta xValLast = 0,0;
flyta yValLast = 0,0;
void setup() {
size(36*scaleNum,24*scaleNum);
beginRecord (PDF, filnamn + ".pdf");//save som PDF
bakgrund (255); //white bakgrund
noFill (); //don't fyllning loopar
strokeWeight (0,001); //hairline bredd
skalan pixel avstånd
amplitud = amplituden/dpi * scaleNum;
minDist = minDist/dpi * scaleNum;
mellanrum = avstånd/dpi * scaleNum;
Rita sinusvågor
flyta incrNum = TWO_PI/thetaIter; //calculcate kantiga inrementation belopp
flyta radIncrNum = (2 * amplitud + avstånd) / thetaIter; //radial incrementation belopp
radie = outerRad * scaleNum; //calculate yttersta radie (på 5,75")
stroke (255,0,0), //red
beginShape();
//Draw tyst Spårets yttre
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
//calculate ny punkt
radCalc = radie;
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
//Store sista koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
// }
RADIUS--= radIncrNum; //decreasing radie former spiral
// }
flyta [] songData = processAudioData();
int numGrooves = 0;
heltal index = 0;
medan (radie > innerRad * scaleNum) {
int numpoints = 0;
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
radCalc = radie + songData [index];
index +=(samplingRate*secPerMin/rpm)/thetaIter, //go till nästa plats i ljuddata
xVal = width/6+radCalc*cos(theta);
yVal = 3*height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
numpoints ++;
}
RADIUS--= radIncrNum; //decreasing radie former spiral
}
numGrooves ++;
println(numGrooves);
println(numpoints);
}
endShape();
om (cutlines) {
Rita skära linjer (100 enheter = 1")
stroke (0), //draw i svart
ellips (bredd/6, 3 * höjd/4, innerHole * scaleNum, innerHole * scaleNum); //0.286 "centrumhål
ellips (bredd/6, 3 * höjd/4, diameter * scaleNum, diameter * scaleNum); //12 "diameter ytterkanten
}
endRecord();
Exit();
berätta för mig när det är över
println("finished.");
}
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;
}
och videon:
Om det är lite svårt att höra på grund av alla hoppa, kom skära mycket renare ut på detta test. Du kan också höra att ljud ljudet avtog, detta var en avrundning fråga i min kod som jag behandlas senare. I min nästa test minskade jag amplituden av vinka till 12px att se om jag kunde få nålen bo i spåret.
flyta amplitud = 12.
Det finns fortfarande några frågor. Framför allt, är rekordet skev från skärprocessen. Även skruvas hastigheten på ljudet fortfarande upp. I min sista version jag fast hastighet frågan (det var en avrundning problem) och försökt tejpa akryl ner till sängen för att se om det skulle hjälpa med den skevhet. De inställningar jag använde på laserskärare är:
Laser inställningar (epilog 120W)
100 hastighet
5000freq
12 power
I detta klipp som jag faktiskt tillämpades korrekt RIAA utjämningen och används en anti-aliasing lågpassfilter samplingRate/2 = 2,25 kHz.
Här är den sista koden:
ljud tester
av Amanda Ghassaei
Jan 2013
/*
* 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.pdf.*;
parametrar
Snöre arkivnamnen = "idioteque.txt";
flyta rpm = 45,0;
flyta samplingRate = 44100;
float dpi = 1200; //dpi Cutter
flyta amplitud = 10; //in pixlar
flyta avstånd = 10; //space mellan spåren (i bildpunkter)
float minDist = 6.0;//min pixel avstånd mellan punkter i vektorbana (att förhindra cutter flippar ut) 0.25919998
float diameter = 11.8;//diameter av post i tum
flyta innerHole = 0.286;//diameter av centrumhål i tum
flyta innerRad = 2.2;//2.2;//radius av innersta spår i tum
flyta outerRad = 5.75;//radius av yttersta groove i tum
booleska cutlines = true; //cut de inre och yttre omkrets
konstanter
flyta secPerMin = 60.
int scaleNum = 72. //scale faktor av vektorer (standard 72 dpi)
lagring för en given punkt i spåret
float radCalc;
float xVal;
float yVal;
float theta; //angle variabel
flyta thetaIter = 5880; //how många värden av theta per cykel
float radie; //variable att beräkna radien av spår
flyta xValLast = 0,0;
flyta yValLast = 0,0;
void setup() {
size(36*scaleNum,24*scaleNum);
beginRecord (PDF, filnamn + ".pdf");//save som PDF
bakgrund (255); //white bakgrund
noFill (); //don't fyllning loopar
strokeWeight (0,001); //hairline bredd
skalan pixel avstånd
amplitud = amplituden/dpi * scaleNum;
minDist = minDist/dpi * scaleNum;
mellanrum = avstånd/dpi * scaleNum;
Rita sinusvågor
flyta incrNum = TWO_PI/thetaIter; //calculcate kantiga inrementation belopp
flyta radIncrNum = (2 * amplitud + avstånd) / thetaIter; //radial incrementation belopp
radie = outerRad * scaleNum; //calculate yttersta radie (på 5,75")
stroke (255,0,0), //red
beginShape();
Rita tyst Spårets yttre
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
radCalc = radie;
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
}
RADIUS--= radIncrNum; //decreasing radie former spiral
}
flyta [] songData = processAudioData();
int numGrooves = 0;
heltal index = 0;
int indexIncr = int((samplingRate*secPerMin/rpm)/thetaIter);
medan (radie > innerRad * scaleNum & & index < songData.length-6000) {
int numpoints = 0;
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
radCalc = radie + songData [index];
index += indexIncr; //go till nästa plats i ljuddata
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
numpoints ++;
}
RADIUS--= radIncrNum; //decreasing radie former spiral
}
numGrooves ++;
println(numGrooves);
println(numpoints);
}
Rita tysta inre låst groove
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
radCalc = radie;
xVal = width/6+radCalc*cos(theta);
yVal = height/4-radCalc*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
}
RADIUS--= radIncrNum; //decreasing radie former spiral
}
för (theta = 0; theta < TWO_PI; theta += incrNum) {//for theta mellan 0 och 2pi
beräkna ny punkt
xVal = width/6+radius*cos(theta);
yVal = height/4-radius*sin(theta);
IF(((xValLast-xVal)*(xValLast-xVal)+(yValLast-yVal)*(yValLast-yVal)) >(minDist*minDist)) {
vertex(xVal,yVal);
lagra senaste koordinater i vektorbana
xValLast = xVal;
yValLast = yVal;
}
}
endShape();
om (cutlines) {
Rita skära linjer (100 enheter = 1")
stroke (0), //draw i svart
ellips (bredd/6, höjd/4, innerHole * scaleNum, innerHole * scaleNum); //0.286 "centrumhål
ellips (bredd/6, höjd/4, diameter * scaleNum, diameter * scaleNum); //12 "diameter ytterkanten
}
endRecord();
Exit();
berätta för mig när det är över
println("finished.");
}
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;
}
och den slutliga produkten:
Det fanns fortfarande lite snett, men de tempo frågorna är helt löst. Det är intressant att höra hur mycket försämrar ljudkvaliteten från utsidan av disken i mitten av disken - detta är på grund av sänkt periferihastigheten av post som du flyttar mot mitten (förklaras i steg 2).