Mục lục:
- Bước 1: Thành phần Verzamelen
- Bước 2: Nguyên mẫu Bouwen
- Bước 3: Nguyên mẫu mã
- Bước 4: Uittesten nguyên mẫu
- Bước 5: Chỉnh sửa "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden
- Bước 6: Werking Originele Buttons + Dremelen
- Bước 7: Bedrading Solderen + Buttons Vastlijmen
- Bước 8: Plaats Maken trong De Behuizing
- Bước 9: Bedrading Aansluiten Op Protobord
- Bước 10: Verstevigen
- Bước 11: Mã Voor Het Communiceren Met Reaper
- Bước 12: Bộ điều khiển Uittesten
Video: Dự án Arduino Guitar Hero: 12 bước (có hình ảnh)
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
Wij zijn Maarten Vrebos, Justin Cavanas en Wannes Stroobandt vi chúng tôi phát triển đa phương tiện & giao tiếp. Voor een groepsproject voor het vak Nguyên tắc Nghe nhìn & CNTT hebben wij een Guitar Hero-gitaar gehackt en gebruikt als behuizing voor onze MIDI-controller. Het was onze bedoeling om de bestaande knoppen op de gitaar intern te vervangen. Bộ điều khiển Onze zal growgehouden en bespeeld worden als een normale gitaar. Aangezien we iets hebben gehackt hebben we er niet veel extra materiaal in moeten verwerken.
In de afbeelding kan u onze allereerste schets op papier zien van hoe het eindproduct er zou moeten uitzien gặp daarnaast een foto van de gitaar die als behuizing zal worden gebruikt.
Wij hebben ons voor dit project 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…
Benodigdheden voor dit dự án
- 6 nút nhấn kleine
- 7 điện trở 1kohm
- 1 đèn LED 1 gele 1
- đèn LED blauwe
- 1 Arduino Uno R3
- 1 đèn LED
- 2 đèn LED cưỡi ngựa
- 1 schuifschakelaar
- 1 breadboard
- 1 chiết áp
- 1 protobord
- 1 Guitar Hero gitaar
- Voldoende bedrading
- Materiaal om te selleren / dremelen /
- Schroevendraaier
Bước 1: Thành phần Verzamelen
Nguyên mẫu Voor ons (op breadboard) hebben we volgende componenten gebruikt:
6 nút bấm
7 điện trở 1kohm
1 đèn LED vàng
1 đèn LED xanh lam
1 Arduino Uno R3
1 đèn LED xanh
2 đèn LED đỏ
1 Schuifschakelaar
1 bảng mạch
1 chiết áp
Bước 2: Nguyên mẫu Bouwen
Om ons nguyên mẫu te bouwen hebben we al onze componenten gebruikt op een breadboard, deze breadboard dient dan als testobject zodat we niet meteen in de behuizing te werk moeten gaan. Dit nguyên mẫu hebben we dan ook gedigitaliseerd qua tinkercad.com, op deze manier hadden we een duidelijk overzicht van ons nguyên mẫu dat elk groepslid ook kon bewerken.
Er worden 5 kleine pushbuttons gebruikt die Musheren als 5 snaren en een grote pushbutton die in combinatie gặp één của meerdere 'snaren' moet loden ingedrukt om een auditief effect te krijgen. De verschillende LED-lampjes dienen gewoon als visuele điều khiển om er zeker van te zijn dat de interactie succesvol werkt.
Bước 3: Nguyên mẫu mã
Globale variabelen
Trong het eerste deel van de code initialiseer jeucale variabelen voor de ghim van arduino una waar alle pushbuttons mee verbonden zijn.
// zet số pin waar mainButton (snaar) en andere button aan verbonden zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int buttonPin1 = 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; // nummer van pushbutton5
Hierna loden er twee mảng 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 ghim van de LED lichtjes.
const int ledPin1 = 13; // số của chân LED 13
const int ledPin2 = 12; // số chân LED 12 const int ledPin3 = 11; // số chân LED 11 const int ledPin4 = 10; // số chân LED 10 const int ledPin5 = 9; // số chân LED 9 const int potPin = A5; // số chân LED A5
De laatste global variabelen dienen als 'bang' voor de sensor (zijn de pushbuttons ingedrukt of niet? Potentiometer, lichtsensor).
// khởi tạo buttonStates voor de knoppen (ingedrukt of niet) int mainButtonState = 0; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int buttonState4 = 0; int buttonState5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;
Cài đặt
Chức năng thiết lập Nu volgt de void. Deze là van het loại void (geeft geen waarde terug) en detruction hierin loden maar 1 keer uitgevoerd.
Bij elke chức năng là commentaar geschreven wat er concreet gedaan wordt. Extra uitleg over wat een specifieke functie concreet doet is te vinden in de arduino reference
void setup () {// data rate per seconde (baud) voor seriele data transmissie Serial.begin (9600); // Initialiseer de ledPin variabelen als đầu ra pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // nút nhấn khởi tạo alle als 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); }
Chức năng hư không
Na de setup () functie volgt de loop () functie, de hướng dẫn die hierin staan gaan herhaald uitgevoerd worden.
void loop () {// 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);
// trạng thái nút nhấn của alle trong mảng een
int buttonState = {buttonState1, buttonState2, buttonState3, buttonState4, buttonState5};
// leest de waarde uit van de chiết áp en de lichtsensor
potValue = analogRead (potPin); lightValue = analogRead (lightSensor);
// người khai báo mảng mainStates en geef die de standaard waarden 0 in.
int mainStates = {0, 0, 0, 0, 0};
// vòng lặp de array aantalKnoppen
for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // initialiseer alle knopPinnen als input digitalRead (knopPinnen ); // lees de waarde van alle knoppinnen uit // inden de mainswitch (snaar) ingedrukt is, print alle knopnamen, alle buttontates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}
Bước 4: Uittesten nguyên mẫu
Nadat het nguyên mẫu gebouwd is volgens ons model en de code geschreven is in Processing, is het tijd om het nguyên mẫu uit te testen. Op de video is te zien dat alle knoppen een Reatie geven op de bijhorende ledjes en dat ook combinaties van knoppen mogelijk zijn.
Trong video de tweede is te zien hoe onze tremolo werkt aan de hand van een chiết áp trong de gitaar en hoe de waardes worden uitgelezen trong Chế biến.
Bước 5: Chỉnh sửa "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden
Als de code đúng werkte op het nguyên mẫu zijn we begonnen gặp het "ontmantelen" van onze Guitar Hero-gitaar. We hebben de gitaar opengemaakt gặp een schroevendraaier en bekeken Welke originele componenten we eventueel nog zouden kunnen hergebruiken voor onze controller. Uiteindelijk hebben we onze eigen push button in de bestaande button gekregen (zie volgende stap). We hebben de tremolo ook gebruikt voor ons eindproduct en voor onze hoofdbutton (nút khởi đầu 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 đúng werkten.
Bước 6: Werking Originele Buttons + Dremelen
Op de bijhorende video is 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 button te verwerken in de originele knoppen hebben we de binnenkant van de originelen er grotendeels uitgehaald zoals te zien is op de foto.
Bước 7: Bedrading Solderen + Buttons Vastlijmen
Omdat we niet meer met een breadboard werken moeten de draden gesoldeerd worden om zo de verschillende componenten met elkaar te verbinden. Nadat dit gebeurd is kunnen we de buttonanticlijmen zoals te zien is op de foto's. Eens dit gebeurd là kunnen we doorgaan naar de volgende stap.
Bước 8: Plaats Maken trong De Behuizing
Omdat dit Guitar Hero-model redelijk krap was om mee te werken hebben we extra 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 in de gitaar. Omdat er overal in de binnenkant obsakels 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 is te zien dat we in 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 is te zien dat we de draden die rechtstreeks verbonden worden gặp de Arduino cửa een gat trong de onderkant van de gitaar de behuizing verlaten.
Bước 9: Bedrading Aansluiten Op Protobord
Om alle componenten gặp elkaar te verbinden hebben we gebruik gemaakt van een protobord. Dit is een bordje dat eigenlijk op net dezelfde manier werkt als een breadbord, maar dan betrouwbaarder en Effectsënter. We hebben de bedrading aan het bordje gesoldeerd zoals te zien is op de derde foto. Dit bord is het centrale punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).
Bước 10: Verstevigen
Cảm giác hoàn thiện của Als là hết sức mạnh mẽ. Op deze foto is te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan de button verstevigen gặp stukjes karton.
Bước 11: Mã Voor Het Communiceren Met Reaper
Mã deze được chọn trong twee delen, het eerste deel nằm trong de arduino IDE (môi trường phát triển tương tác) geschreven. Die code wordt geüpload naar arduino zelf en dient om alle waarden van de sensor van de midi controller uit te lezen en door te sturen naar processing.
Chế biến là het tweede gedeelte. Deze code dient om alles wat arduino doortuurt te ontvangen en door te sturen naar Reaper.
Arduino
/ * Mã này là một bản phác thảo cơ bản để giao tiếp với Xử lý thông qua Nối tiếp.
Đó là một bản thiết kế mà bạn có thể đặt mã của riêng mình
được chỉ định cho các nút, chiết áp hoặc cảm biến của riêng bạn.
Nó có một cái bắt tay để đảm bảo rằng chúng tôi có liên hệ
và định dạng mà chúng ta đang giao tiếp được quyết định
Điều quan trọng là phải xây dựng thông điệp theo cách này, để Xử lý biết cách giải cấu trúc nó và gửi các thông báo OSC chính xác đến DAW của chúng tôi
làm cho werkcollege AV&IT
thg 8 năm 2017
*
/ tốc độ truyền
const dài baudRate = 115200;
// thời gian chờ tính bằng mili giây giữa các lần thăm dò ý kiến đến các chân
const int loopPauseTime = 200; // mili giây
// giá trị bắt đầu và kết thúc cho tin nhắn được gửi trên Serial
const String startString = "*", endString = "#";
const char contactCharacter = '|';
// mã pin của
// các biến toàn cục khác
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;
// cảm biến tương tự
const int potPin = A5; // pin voor tremolo
// Chúng ta cần hàm này để thiết lập liên hệ với bản phác thảo Xử lý
// Giữ nó ở đây void settingContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // gửi một ký tự và đợi phản hồi… delay (loopPauseTime); } Serial.read (); }
void setup () {
// đặt mã pin cho tất cả các chân for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // bỏ ghi chú nếu bạn sử dụng cảm biến hoạt động trên 3V thay vì 5V // bạn cũng sẽ phải nối chân 'ext' sang 3,3V // analogReference (EXTERNAL);
// khởi tạo các comms nối tiếp
Serial.begin (baudRate); while (! nối tiếp); // đợi bắt tay thành lậpContact (); }
void loop () {
// BƯỚC 1: ĐỌC CÁC NÚT // thăm dò tất cả các chân và ánh xạ việc đọc vào phạm vi thích hợp int buttonStates [aantalKnoppen]; / * buttonStates [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); for (int i = 0; i <aantalKnoppen; i ++) {buttonStates = digitalRead (knopPinnen ); } potValue = analogRead (potPin); // ví dụ: // float v0 = map (bpm, 0, 1023, 60, 250); // nếu bạn muốn sử dụng float chuẩn hóa (ví dụ: cho volume) // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;
// BƯỚC 2: VIẾT TIN NHẮN
Serial.print (startString); // bắt đầu một chuỗi thông báo for (int i = 0; i <aantalKnoppen; i ++) {if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }} else {buttonStates = 0; Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Serial.print (","); Serial.print (map (potValue, 0, 1023, 0, 100)); // ghi kết thúc thông báo Serial.print (endString);
// chờ một lúc..
trì hoãn (loopPauseTime); }
Xử lý
Disclaimer: Niet alle code van de xử lý sketch staat hier trong geschreven, voor de volledige code zie het bestand: ProcessingSoundControl_handout_v6_1.pde trong bijlage
De volgende hướng dẫn moeten aangepast worden (inden gật gù):
// Baudrate moet hetzelfde zoals zijn trong de arduino sketch
cuối cùng int baudRate = 115200;
// Zoek naar het địa chỉ IP trong máy gặt (ảnh chụp màn hình zie trong bijlage)
// Xử lý stuurt naar dit andres en reaper luistert hier naar //
// final String remoteIP = "192.168.1.43"; //ví dụ. "127.0.0.1";
final String remoteIP = "10.3.209.60";
// Ghi lại sendPort và điền vào Reaper.
// Đây là cổng mà Xử lý gửi đến và Reaper lắng nghe.
cuối cùng int nghePort = 12000, sendPort = 12000;
// NghePort ở đây là để gỡ lỗi tích cực.
// portNames cũng ở đây để gỡ lỗi.
// final String portName = "/ dev / ttyACM0";
cuối cùng String portName = "COM5"; // "/ dev / ttyUSB0";
/////////////////////// HẾT THAM SỐ NGƯỜI DÙNG /////////////////////////// ////
nhập xử lý.serial. *;
nhập java.util. *;
nhập oscP5. *;
nhập netP5. *;
OscP5 oscP5;
NetAddress myRemoteLocation;
Serial commsPort; // Cổng nối tiếp
boolean messageArrived = false;
Chuỗi đến = "", IncomingOSCMessage = "";
cuối cùng char startChar = '*', endChar = '#'; cuối cùng char contactCharacter = '|';
// Để đảm bảo chúng tôi chỉ gửi các tham số (giá trị) thay đổi
// các biến thể chung này được xóa ở đây nhưng // không được khởi tạo ở đây! HashMap oldParams, newParams, toSendParams;
// Chúng ta cần tách thư ở mỗi dấu phẩy
void processIncoming () {String resVec = incoming.split (","); // chúng ta nhận được các cặp tên + giá trị // vì vậy với mọi tên (+2)… hãy thử {for (int i = 0; i <resVec.length; i + = 2) {float value = Float.parseFloat (resVec [i + 1]); // đưa chúng vào Hashtable newParams.put (resVec , value); }} // nếu lỗi xảy ra, hãy bắt nó hiển thị và thoát. catch (Exception ex) {println ("Thông báo ngoại lệ:" + ex); printArray (resVec); lối ra(); }}
// Để lọc tin nhắn của chúng tôi
/ * Chúng tôi đảm bảo chỉ có thông báo OSC-out khi * thông báo đầu vào (Serial) thay đổi * Nghĩa là: nếu chúng ta vặn / ấn nút và nó thay đổi giá trị. * Vì vậy, chúng tôi lọc ra các giá trị đến thực sự thay đổi * lưu ý: chúng tôi sẽ không tránh các giá trị nhảy * đến từ ví dụ như cảm biến gia tốc hoặc cảm biến khoảng cách * bạn sẽ cần tự làm mịn các giá trị đó trong Arduino * / void filterParams () {toSendParams = new Bản đồ băm(); for (String key: newParams.keySet ()) {// nếu khóa đã có if (oldParams.containsKey (key)) {// key hiện tại và giá trị không giống nhau, sau đó cập nhật if (! oldParams.get (key).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// khóa không có trong các tham số cũ, vì vậy hãy đặt nó! toSendParams.put (key, newParams.get (key)); } oldParams.put (key, newParams.get (key)); }}
void makeOSC () {
for (String key: toSendParams.keySet ()) {OscMessage myMessage = new OscMessage ("/" + key); myMessage.add (toSendParams.get (key)); / * gửi tin nhắn * / oscP5.send (myMessage, myRemoteLocation); }}
void translateMessage () {
processIncoming (); filterParams (); makeOSC (); } // Khi chúng ta muốn in ra cửa sổ void ShowIncoming () {// để xem thông báo đến, như được thiết lập trong văn bản HashMap ("Incoming from Arduino", 20, 20); int y = 20; for (Khóa chuỗi: newParams.keySet ()) {y = y + 20; text (key, 20, y); text (newParams.get (key), 300, y); }}
void showOsc () {
văn bản (IncomingOSCMessage, 300, 200); IncomingOSCMessage = ""; }
void setup () {
kích thước (1000, 800); // Kích thước sân khấu fill (255); nền (0); oldParams = new HashMap (); newParams = new HashMap (); // printArray (Serial.list ()); commsPort = new Serial (this, portName, baudRate);
/ * khởi động oscP5, nghe tin nhắn đến * /
oscP5 = OscP5 mới (cái này, nghePort);
/ * myRemoteLocation là một NetAddress. một NetAddress có 2 tham số, * địa chỉ ip và số cổng.myRemoteLocation được sử dụng làm tham số trong * oscP5.send () khi gửi gói tin osc đến máy tính, thiết bị, ứng dụng * khác. cách sử dụng xem bên dưới. cho các mục đích thử nghiệm, cổng lắng nghe * và cổng của địa chỉ vị trí từ xa giống nhau, do đó bạn sẽ * gửi thông báo trở lại bản phác thảo này. * / myRemoteLocation = new NetAddress (remoteIP, sendPort); }
void draw () {
if (messageArrived) {background (0); dịchMessage (); ShowIncoming (); messageArrived = false; } showOsc (); }
void serialEvent (Serial commsPort) {
// đọc một byte từ cổng nối tiếp: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // hỏi thêm println ("bắt đầu…"); nghỉ; case startChar: incoming = ""; nghỉ; case endChar: messageArrived = true; // println ("end of msg"); nghỉ; mặc định: incoming + = inChar; nghỉ; }}
/ * tin nhắn osc đến được chuyển tiếp đến phương thức oscEvent. * /
void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // lấy đối số osc đầu tiên
IncomingOSCMessage + = "\ n" +
String.format ("### đã nhận được thông báo osc:" + "addrpattern:" + theOscMessage.addrPattern () + ":% f", value); println (IncomingOSCMessage); }
Bước 12: Bộ điều khiển Uittesten
Nu alles là aangesloten, mã alle là geschreven vi alles là gedubbelcheckt là 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 Bộ điều khiển MIDI!
Đề xuất:
Sử dụng Guitar Hero Guitar để điều khiển thu phóng (Chỉ dành cho Windows): 9 bước
Sử dụng Guitar Hero Guitar để điều khiển Zoom (Chỉ dành cho Windows): Khi chúng ta đang ở giữa đại dịch toàn cầu, nhiều người trong chúng ta đang mắc kẹt trong việc dọn dẹp nhà cửa và tham gia các cuộc họp trên Zoom. Sau một thời gian, điều này có thể trở nên rất nhạt nhẽo và tẻ nhạt. Trong khi dọn dẹp nhà cửa, tôi tìm thấy một cây đàn Guitar Hero cũ bị ném vào
Sửa lỗi ngắt kết nối guitar Hero Guitar: 5 bước (có hình ảnh)
Khắc phục sự cố ngắt kết nối của Guitar Hero Guitar: Vì vậy, bạn vừa mua một cây đàn guitar hero đã qua sử dụng đẹp đẽ đó từ ebay và khi nó đến tay bạn, nó sẽ không kết nối với USB dongle đó, vì vậy bạn nghĩ rằng bạn vừa lãng phí 30 € Dưới cống. Nhưng có một bản sửa lỗi và bản sửa lỗi này có thể sẽ hoạt động tốt nhất
Arduino Uno: Hình ảnh động bitmap trên Tấm chắn hiển thị màn hình cảm ứng TFT ILI9341 Với Visuino: 12 bước (có Hình ảnh)
Arduino Uno: Ảnh động bitmap trên Tấm chắn hiển thị màn hình cảm ứng TFT ILI9341 Với Tấm chắn màn hình cảm ứng TFT dựa trên Visuino: ILI9341 là Tấm chắn hiển thị chi phí thấp rất phổ biến cho Arduino. Visuino đã hỗ trợ chúng trong một thời gian khá dài, nhưng tôi chưa bao giờ có cơ hội viết Hướng dẫn về cách sử dụng chúng. Tuy nhiên, gần đây có rất ít người hỏi
Guitar Hero Guitar với loa tích hợp: 8 bước
Guitar Hero Guitar với loa tích hợp: Về cơ bản, tôi đã mở một bộ điều khiển Guitar Hero và băn khoăn không biết mình có thể lắp gì bên trong. Nó có vẻ nhẹ nên tôi nghĩ rằng có rất nhiều chỗ. Chắc chắn, có rất nhiều. Ban đầu, tôi định đặt một chiếc iPod Shuffle vào cổ guitar và ro
Sử thi! Guitar Hero - Double Neck Guitar Thất bại: 7 bước (có Hình ảnh)
Sử thi! Guitar Hero - Đôi Guitar Cổ … Thất bại: Năm 2015 đánh dấu kỷ niệm 10 năm xuất hiện của hiện tượng văn hóa đại chúng Guitar Hero. Bạn còn nhớ, trò chơi điện tử đã trở nên phổ biến hơn cả nhạc cụ mà nó chỉ bắt chước thành công một cách mơ hồ? Còn cách nào tốt hơn để kỷ niệm một năm của nó hơn là