Isi kandungan:
- Langkah 1: Componenten Verzamelen
- Langkah 2: Prototaip Bouwen
- Langkah 3: Prototaip Kod
- Langkah 4: Prototaip Uittesten
- Langkah 5: Mengamalkan "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden
- Langkah 6: Memakai Butang Originele + Dremelen
- Langkah 7: Bedrading Solderen + Butang Vastlijmen
- Langkah 8: Plaat Dibuat secara De Behuizing
- Langkah 9: Bedrading Aansluiten Op Protobord
- Langkah 10: Verstevigen
- Langkah 11: Code Voor Het Communiceren Met Reaper
- Langkah 12: Pengawal Uittesten
Video: Projek Guitar Hero Arduino: 12 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:12
Wij zijn Maarten Vrebos, Justin Cavanas dan Wannes Stroobandt dan kami mempelajari multimedia & komunikatietechnologie. Voor een groepsproject voor het vak Audiovisual & IT Principles hebben wij een Guitar Hero-gitaar gehackt en gebruikt juga bertindak sebagai pengawal MIDI. Het was ono bedoeling om de bestaande knoppen op de gitaar intern te vervangen. Pengawal onze zal broadgehouden en bespeeld worden als een normale gitaar. Aangezien we weets hebben gehackt hebben we er niet veel extra materiaal di moeten verwerken.
Dalam jangka masa panjang kan u onze allereerste schets op papier zien van hoe het eindproduct er zou moeten uitzien bertemu daarnaast een foto van de gitaar die als berperilaku zal worden gebruikt.
Wij hebben ons voor dit projek gebaseerd op volgende bronnen:
slapyak.wordpress.com/guitar-hero-midi-con…
www.instructables.com/id/Converting-a-rescu…
gizmodo.com/391834/turn-your-guitar-hero-g…
Projek Benodigdheden voor dit
- 6 butang tekan kleine
- 7 perintang 1kohm
- 1 gele LED 1
- LED blauwe
- 1 Arduino Uno R3
- 1 LED groene
- 2 tiang LED
- 1 schuifschakelaar
- 1 papan roti
- 1 potensiometer
- 1 protobord
- 1 gitar Gitar Wira
- Tempat tidur Voldoende
- Materiaal om te solderen / dremelen /
- Schroevendraaier
Langkah 1: Componenten Verzamelen
Prototaip Voor ons (op breadboard) hebben we volgende komponenen gebruikt:
6 Butang tekan
7 1kohm Perintang
1 LED Kuning
1 LED Biru
1 Arduino Uno R3
1 LED Hijau
2 LED Merah
1 Schuifschakelaar
1 Papan Roti
1 Potensiometer
Langkah 2: Prototaip Bouwen
Contohnya, prototaip dan kualiti, kami juga menyediakan komponen roti, papan serat roti dan lain-lain, dan kami juga akan melihatnya. Oleh prototaip hebben we dan ook gedigitaliseerd melalui tinkercad.com, op deze manier haded we een duidelijk overzicht van ons prototype dat elk groepslid ook kon bewerken.
Er worden 5 kleine pushbuttons gebruikt die fungeren als 5 snaren en een grote pushbutton die dalam combinatie bertemu dengan meerdere 'snaren' moet worden ingedrukt om een auditief effect te krijgen. De verschillende LED-lampjes dienen gewoon als visuele controle om er zeker van te zijn dat de interactie succesvol werkt.
Langkah 3: Prototaip Kod
Pemboleh ubah global
Dalam het eerste deel van de code initialiseer je globale variabelen voor de pins van arduino uno waar alle pushbuttons mee verbonden zijn.
// nombor pin zet waar mainButton (snaar) en dan butang aan verbonden zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; butang const intPin1 = 2; // nummer van pushbutton1 const int buttonPin2 = 3; // nummer van pushbutton2const int buttonPin3 = 4; // nummer van pushbutton3const int buttonPin4 = 5; // nummer van pushbutton4const int buttonPin5 = 6; // butang tekan nombor n5
Hierna worden er twee arrays aangemaakt voor de namen van de pushbuttons en hun pinnummer.
const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [aantalKnoppen] = {2, 3, 4, 5, 6};
En dan nog variabelen voor de pins van de LED lichtjes.
const int ledPin1 = 13; // bilangan pin LED 13
const int ledPin2 = 12; // bilangan pin LED 12 const int ledPin3 = 11; // bilangan pin LED 11 const int ledPin4 = 10; // bilangan pin LED 10 const int ledPin5 = 9; // bilangan pin LED 9 const int potPin = A5; // bilangan pin LED A5
De laatste globale variabelen dienen als 'menyatakan' voor de sensor (zijn de pushbuttons ingedrukt of niet? Potensiometer, lichtsensor).
// butang inisialisasiStates voor de knoppen (ingedrukt of niet) int mainButtonState = 0; butang intState1 = 0; butang intState2 = 0; butang intState3 = 0; butang intState4 = 0; butang intState5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;
Persediaan
Nota volgt de void setup functie. Deze adalah jenis van het void (geeft geen waarde terug) en de instruksi hierin worden maar 1 keer uitgevoerd.
Bij elke functie is commentaar geschreven wat er concreet geza wordt. Tambahan uitleg over wat een specifieke functie concreet doet adalah te vinden dalam rujukan de arduino
batal penyediaan () {// kadar data sesaat (baud) siriel data transmissie Serial.begin (9600); // Initialiseer de ledPin variabelen juga output pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // inisialisasi alle pushbuttons juga input: pinMode (mainButton, INPUT); pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (buttonPin3, INPUT); pinMode (buttonPin4, INPUT); pinMode (buttonPin5, INPUT); pinMode (potPin, INPUT); pinMode (lightSensor, INPUT); }
Batal functie
Na de setup () functie volgt de loop () functie, de instruksikan die hierin staan gaan herhaald uitgevoerd worden.
gelung void () {// lees de staat van de pushbuttons uit (ingedrukt of niet) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);
// alle menekan butang statusen dalam susunan een
int buttonStates = {buttonState1, buttonState2, buttonState3, buttonState4, buttonState5};
// leest de waarde uit van de potensiometer en de lichtsensor
potValue = analogRead (potPin); lightValue = analogRead (lightSensor);
// deklarator een array mainStates en geef die de standaard waarden 0 in.
int mainStates = {0, 0, 0, 0, 0};
// gelung atas de array aantalKnoppen
untuk (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // inisialisasi alle knopPinnen juga memasukkan digitalRead (knopPinnen ); // lees de waarde van alle knoppinnen uit // indien de mainswitch (snaar) ingedrukt adalah, cetak alle knopnamen, alle buttonstates if (mainButtonState == TINGGI) {Serial.print (namenKnoppen ); Cetakan bersiri (","); Serial.println (butangStates ); }}
Langkah 4: Prototaip Uittesten
Nadat het prototaip gebouwd is volgens ons model en de code geschreven sedang dalam Pemprosesan, adakah masih ada prototaip dan ujian. Op de video adalah te zien dat alle knoppen een reactie geven op de bijhorende ledjes en dat ook combinaties van knoppen mogelijk zijn.
Dalam video de tweede adalah te zien hoe onze tremolo werkt aan de hand van een potensiometer in de gitaar en hoe de waardes worden uitgelezen in Processing.
Langkah 5: Mengamalkan "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden
Als de code betul werkte op het prototaip zijn kami mula bertemu het "ontmantelen" van onze Guitar Hero-gitaar. Kami hebben de gitaar opengemaakt bertemu dengan een schroevendraaier dan bekeken welke originele komponenenan kita dapat melihat pengawal selia. Uiteindelijk hebben kita memaksakan butang eigen dalam butang de bestaande gekregen (zie volgende stap). Kami hebben de tremolo ook gebruikt voor ons eindproduct en voor onze hoofdbutton (butang permulaan om als een combinatie af te spelen) hebben we ook de originele twee button gebruikt (zie vierde foto). De LEDjes zullen verdwijnen (deze waren enkel ter indicatie zodat we zagen dat alle knoppen betul werkten.
Langkah 6: Memakai Butang Originele + Dremelen
Video op de bijhorende adalah de wijze te zien waarop de twee originele knoppen werken als een soort van schakelaar die wij gebruiken om een effect te genereren bij combinatie van knoppen.
Om onze eigen butang te verwerken in de originele knoppen hebben we de binnenkant van de originelen er grotendeels uitgehaald zoals te zien adalah op de foto.
Langkah 7: Bedrading Solderen + Butang Vastlijmen
Omdat we niet meer bertemu een breadboard werken moeten de draden gesoldeerd worden om zo de verschillende komponenen bertemu elkaar te verbinden. Nadat dit gebeurd adalah kunnen we de κουμπιά besar zoals te zien adalah op de foto. Eens dit gebeurd adalah kunnen we doorgaan naar de volgende stap.
Langkah 8: Plaat Dibuat secara De Behuizing
Omdat dit Guitar Hero-model redelijk krap adalah om mee te werken hebben we plaats moeten maken d.m.v. dremelen. Zo hebben we uit de achterkant van de gitaar een hele strook verwijderd zodat er meer plaats ontstaat voor de bedrading di de gitaar. Omdat er overal in de binnenkant obstakels waren, waaronder veel buisjes om de vijzen in te bevestigen, hebben we die ook verwijderd om optimaal van de gegeven ruimte gebruik te kunnen maken. Op de vierde en vijfde foto adalah zien dat kami di de achterkant van de gitaar een doorgang hebben gecreëerd voor de draden die naar de button gaan omdat de gitaar anders niet meer te sluiten was. En op de laatste foto adalah zien dat we de draden die rechtstreeks verbonden worden bertemu de Arduino pintu een gat in de onderkant van de gitaar de behaising verlaten.
Langkah 9: Bedrading Aansluiten Op Protobord
Om alle komponenen bertemu elkaar te verbinden hebben we gebruik gemaakt van een protobord. Dit adalah een bordje dat eigenlijk op net dezelfde manier werkt als een breadbord, maar dan betrouwbaarder en efficiënter. We hebben de bedrading aan het bordje gesoldeerd zoals te zien adalah op de derde foto. Dit bord adalah het centrale punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).
Langkah 10: Verstevigen
Als sentuhan akhir adalah verstandig om de losse delen te verstevigen lebih stabil. Op deze foto adalah te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan de buttons verstevigen bertemu stukjes karton.
Langkah 11: Code Voor Het Communiceren Met Reaper
Kod Deze dikendalikan dalam twee delen, namun eerste deel berada di de arduino IDE (persekitaran pembangunan interaktif). Die code wordt geüpload naar arduino zelf en dient om alle waarden van de sensors van de midi controller uit te lezen en pintu te menguatkan pemprosesan naar.
Pemprosesan adalah tweede gedeelte. Deze code dient om alles wat arduino doorstuurt te ontvangen en door te Strengthen naar Reaper.
Arduino
/ * Kod ini adalah lakaran asas untuk berkomunikasi dengan Pemprosesan melalui Serial.
Ini adalah cetak biru di mana anda boleh meletakkan kod anda sendiri
ditentukan untuk butang, potensiometer atau sensor anda sendiri.
Ia mempunyai jabat tangan untuk memastikan kami mempunyai hubungan
dan format di mana kita berkomunikasi ditentukan
Penting untuk membina mesej dengan cara yang sama, supaya Pemprosesan tahu bagaimana mendekonstruksi dan menghantar mesej OSC yang betul ke DAW kami
dibuat untuk werkcollege AV&IT
okt 2017
*
/ kadar baud
const long baudRate = 115200;
// masa untuk menunggu di ms antara tinjauan ke pin
const int loopPauseTime = 200; // mili saat
// nilai permulaan dan akhir untuk mesej yang dihantar di Serial
const String startString = "*", endString = "#";
const char contactCharacter = '|';
// pin id
// pemboleh ubah global yang lain
const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [aantalKnoppen] = {2, 3, 4, 5, 6}; const int mainButton = A1;
int mainButtonState = 0;
int potValue = 0;
// sensor analog
const int potPin = A5; // pin tremol voor
// Kami memerlukan fungsi ini untuk menjalin hubungan dengan lakaran Pemprosesan
// Simpan di sini kosongkan createContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // hantar char dan tunggu tindak balas… kelewatan (loopPauseTime); } Serial.read (); }
batal persediaan () {
// tetapkan pinModes untuk semua pin untuk (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // tidak puas hati jika anda menggunakan sensor yang berfungsi pada 3V dan bukannya 5V // anda perlu memasang pin 'ext' ke 3.3V juga // analogReference (LUARAN);
// memulakan pesanan Serial
Serial.begin (baudRate); sementara (! bersiri); // tunggu tangan berjabat tanganContact (); }
gelung kosong () {
// LANGKAH 1: BACA BUTTON // jajak pendapat semua pin dan petakan bacaannya ke julat int butang yang sesuaiStates [aantalKnoppen]; / * butangStates [0] = digitalRead (knopPinnen [0]); buttonStates [1] = digitalRead (knopPinnen [1]); buttonStates [2] = digitalRead (knopPinnen [2]); buttonStates [3] = digitalRead (knopPinnen [3]); buttonStates [4] = digitalRead (knopPinnen [4]); * / mainButtonState = digitalRead (mainButton); untuk (int i = 0; i <aantalKnoppen; i ++) {buttonStates = digitalRead (knopPinnen ); } potValue = analogRead (potPin); // contoh: // float v0 = peta (bpm, 0, 1023, 60, 250); // jika anda ingin menggunakan float dinormalisasi (mis. untuk kelantangan) // float v1 = peta (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;
// LANGKAH 2: MENULIS MESEJ
Serial.print (startString); // mulakan urutan mesej untuk (int i = 0; i <aantalKnoppen; i ++) {if (mainButtonState == TINGGI) {Serial.print (namenKnoppen ); Cetakan bersiri (","); Serial.print (butangStates ); jika (i <aantalKnoppen - 1) {Serial.print (","); }} lain {buttonStates = 0; Serial.print (namenKnoppen ); Cetakan bersiri (","); Serial.print (butangStates ); jika (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Cetakan bersiri (","); Serial.print (peta (nilai Pot, 0, 1023, 0, 100)); // tulis akhir pesanan Serial.print (endString);
// sila tunggu sebentar..
kelewatan (loopPauseTime); }
Memproses
Penafian: Niet alle code van de processing sketch staat hier in geschreven, voor de volledige code zie het bestand: ProcessingSoundControl_handout_v6_1.pde in bijlage
De volgende mengarahkan moeten aangepast worden (indien nodig):
// Baudrate moet hetzelfde zijn zoals dalam lakaran de arduino
int baudRate akhir = 115200;
// Zoek naar het alamat IP di reaper (tangkapan layar zie di bijlage)
// Memproses stuurt naar dit andres en reaper luistert hier naar //
// final String remoteIP = "192.168.1.43"; // cth. "127.0.0.1";
Remote String remoteIP = "10.3.209.60";
// Perhatikan sendPort dan isikan di Reaper.
// Ini adalah port yang dihantar Pemprosesan dan Reaper mendengarkan.
int akhir mendengarPort = 12000, sendPort = 12000;
// ListenPort di sini adalah untuk melakukan debug secara aktif.
// portNames ada di sini untuk debug juga.
// final String portName = "/ dev / ttyACM0";
port String akhirName = "COM5"; // "/ dev / ttyUSB0";
///////////////////// TAMAT PARAMETER PENGGUNA ///////////////////////// ////
pemprosesan import.serial. *;
import java.util. *;
import oscP5. *;
import netP5. *;
OscP5 oscP5;
NetAddress myRemoteLocation;
CommsPort bersiri; // Port bersiri
boolean messageArriv = palsu;
Rentetan masuk = "", IncomeOSCMessage = "";
char akhir akhirChar = '*', endChar = '#'; char akhir kenalanCharacter = '|';
// Untuk memastikan kami hanya mengirim parameter (nilai) yang berubah
// pemboleh ubah global ini dihapuskan di sini tetapi tidak boleh dimulakan di sini! HashMap oldParams, newParams, toSendParams;
// Kita perlu membagi mesej di setiap koma
proses batalIncoming () {String resVec = incoming.split (","); // kami mendapat nama + pasangan nilai // jadi untuk setiap nama (+2)… cubalah {untuk (int i = 0; i <resVec.length; i + = 2) {float value = Float.parseFloat (resVec [i + 1]); // masukkan mereka ke Hashtable newParams.put baru (resVec , nilai); }} // jika berlaku ralat, mari kita tunjukkan dan keluar. tangkapan (Pengecualian ex) {println ("Mesej Pengecualian:" + ex); printArray (resVec); jalan keluar (); }}
// Untuk menapis mesej kami
/ * Kami memastikan hanya ada pesan keluar OSC ketika * mesej input (Serial) berubah * Maksudnya: jika kita menghidupkan / menekan butang dan ia mengubah nilai. * Oleh itu, kami menyaring nilai masuk yang benar-benar berubah * nota: kami tidak akan mengelakkan nilai melompat * seperti yang datang dari mis. Pecutan atau sensor jarak * anda perlu melicinkannya sendiri di Arduino * / void filterParams () {toSendParams = baru HashMap (); untuk (kekunci rentetan: newParams.keySet ()) {// jika kunci sudah ada jika (oldParams.containsKey (kunci)) {// kunci hadir dan nilai tidak sama, kemudian kemas kini jika (! oldParams.get (kunci). sama (newParams.get (kunci))) {toSendParams.put (kunci, newParams.get (kunci)); }} kunci {// lain tidak terdapat dalam params lama, jadi letakkan! toSendParams.put (kunci, newParams.get (kunci)); } oldParams.put (kunci, newParams.get (kunci)); }}
batal makeOSC () {
untuk (Kekunci rentetan: toSendParams.keySet ()) {OscMessage myMessage = OscMessage baru ("/" + kekunci); myMessage.add (toSendParams.get (kunci)); / * hantar mesej * / oscP5.send (myMessage, myRemoteLocation); }}
batal translateMessage () {
prosesMasuk (); filterParams (); makeOSC (); } // Ketika kita ingin mencetak ke jendela batal ShowIncoming () {// untuk melihat pesan masuk, seperti yang ditetapkan dalam teks HashMap ("Masuk dari Arduino", 20, 20); int y = 20; untuk (Kekunci rentetan: newParams.keySet ()) {y = y + 20; teks (kunci, 20, y); teks (newParams.get (kunci), 300, y); }}
batal showOsc () {
teks (IncomeOSCMessage, 300, 200); IncomeOSCMessage = ""; }
batal persediaan () {
saiz (1000, 800); // Isi saiz pentas (255); latar belakang (0); oldParams = HashMap baru (); newParams = HashMap baru (); // printArray (Siri. senarai ()); commsPort = Serial baru (ini, portName, baudRate);
/ * mulakan oscP5, mendengar mesej masuk * /
oscP5 = OscP5 baru (ini, listenPort);
/ * myRemoteLocation adalah NetAddress. NetAddress mengambil 2 parameter, * alamat ip dan nombor port.myRemoteLocation digunakan sebagai parameter dalam * oscP5.send () ketika mengirim paket osc ke komputer, perangkat, * aplikasi lain. penggunaan lihat di bawah. untuk tujuan pengujian port pendengaran * dan port alamat lokasi jauh adalah sama, oleh itu anda akan * menghantar semula mesej ke lakaran ini. * / myRemoteLocation = NetAddress baru (remoteIP, sendPort); }
undian tidak sah () {
jika (messageArriving) {latar belakang (0); translateMessage (); Tayangan Masuk (); messageArriv = palsu; } showOsc (); }
batal serialEvent (Serial commsPort) {
// baca bait dari port bersiri: char inChar = commsPort.readChar (); tukar (inChar) {case contactCharacter: commsPort.write (contactCharacter); // minta lebih banyak println ("bermula …"); rehat; case startChar: masuk = ""; rehat; case endChar: messageArrive = benar; // println ("akhir msg"); rehat; lalai: masuk + = inChar; rehat; }}
/ * Mesej osc masuk diteruskan ke kaedah oscEvent. * /
void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // dapatkan hujah osc pertama
IncomeOSCMessage + = "\ n" +
String.format ("### menerima mesej osc:" + "addrpattern:" + theOscMessage.addrPattern () + ":% f", nilai); println (IncomeOSCMessage); }
Langkah 12: Pengawal Uittesten
Nu alles adalah aangesloten, alle code adalah geschreven dan alles gedubbelcheckt is het eindelijk tijd om de controller z'n werk te laten doen. Zoek een paar leuke effecten op Reaper en geniet van de voltooide Guitar Hero Pengawal MIDI!
Disyorkan:
Menggunakan Guitar Hero Guitar untuk Mengawal Zum (Windows Only): 9 Langkah
Menggunakan Guitar Hero Guitar untuk Mengawal Zum (Hanya Windows): Ketika kita berada di tengah-tengah wabak global, banyak dari kita terjebak dalam pembersihan rumah dan menyertai perjumpaan di Zoom. Selepas beberapa ketika, ini boleh menjadi sangat hambar dan membosankan. Semasa membersihkan rumah saya, saya menjumpai gitar Guitar Hero lama yang dilemparkan ke
10 Projek Arduino Asas untuk Pemula! Buat sekurang-kurangnya 15 Projek Dengan Papan Tunggal !: 6 Langkah
10 Projek Arduino Asas untuk Pemula! Buat sekurang-kurangnya 15 Projek Dengan Papan Tunggal !: Projek Arduino & Lembaga Tutorial; Termasuk 10 projek asas Arduino. Semua kod sumber, fail Gerber dan banyak lagi. Tiada SMD! Pematerian mudah untuk semua orang. Komponen yang mudah ditanggalkan dan diganti. Anda boleh membuat sekurang-kurangnya 15 projek dengan satu
Guitar Hero Guitar Dengan Pembesar suara terbina dalam: 8 Langkah
Guitar Hero Guitar Dengan Speaker Built-In: Pada dasarnya, saya membuka alat kawalan Guitar Hero dan bertanya-tanya apa yang saya boleh muat di dalamnya. Rasanya ringan jadi saya rasa ada banyak ruang. Sudah tentu, ada banyak. Pada asalnya saya merancang untuk meletakkan iPod Shuffle di leher gitar dan
Epik! Guitar Hero - Gitar Leher Ganda Gagal: 7 Langkah (dengan Gambar)
Epik! Guitar Hero - Gitar Leher Ganda … Gagal: 2015 menandakan ulang tahun 10 tahun fenomena budaya pop Guitar Hero. Anda masih ingat, permainan video yang menjadi lebih popular daripada alat muzik yang hanya samar-samar berjaya ditiru? Apa cara yang lebih baik untuk meraikan dekadnya daripada
Laser-synthitar Dari Guitar Mainan seperti Guitar-hero: 6 Langkah
Laser-synthitar Dari Guitar Toy-Guitar-seperti Guitar: Saya sangat terinspirasi oleh semua video youtube kecapi laser tetapi saya mendapati semuanya terlalu besar untuk dibawa untuk sesi jem atau mereka memerlukan persediaan yang rumit dan komputer dll. Saya memikirkan gitar dengan laser dan bukannya tali. Kemudian saya dapati t