Mündəricat:
- Addım 1: Komponentlərin verilməsi
- Addım 2: Bouwen prototipi
- Addım 3: Kod Prototipi
- Addım 4: Uittesten prototipi
- Addım 5: "Ontmantelen" lərlə tanış olun Komponentlər Gebruikt Gaan Worden
- Addım 6: Wineing Originele Buttons + Dremelen
- Addım 7: Yataq Yandırma + Düymələr Vastlijmen
- Addım 8: De Behuizing -də Maken ilə Plaats
- Addım 9: Bedrading Aansluiten Op Protobord
- Addım 10: Verstevigen
- Addım 11: Kod Voor Het Communiceren Reaper ilə tanış oldu
- Addım 12: Nəzarətçi Uittesten
Video: Gitara Qəhrəmanı Arduino Layihəsi: 12 Addım (Şəkillərlə birlikdə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:48
Wart zart Maarten Vrebos, Justin Cavanas və Wannes Stroobandt, biz multimedia və kommunikasiya texnologiyasını öyrənirik. AudioVizual və İT Prinsipləri, gitara qəhrəmanı və ya MIDI nəzarətçisindən başqa heç bir problemi olmayan bir layihə ilə əlaqədardır. Təcrübəçi təcrübə keçmək üçün ən yaxşı təhsil alan idi. Nəzarətçi, geniş bir sistemə sahibdir. Əlavə məlumat əldə etmək üçün əlavə məlumat əldə edə bilərik.
Mövzu ilə əlaqədar olaraq, məhsulların istehsalında ən çox istifadə olunan məhsulların hamısı bir çox fotoşəkillərdən istifadə etməklə əldə edilə bilər.
Layihə ilə əlaqədar olaraq, bu layihələr çox böyükdür:
slapyak.wordpress.com/guitar-hero-midi-con…
www.instructables.com/id/Converting-a-rescu…
gizmodo.com/391834/turn-your-guitar-hero-g…
Benodigdheden səs layihəsi
- 6 kleine düymələri
- 7 1 kohm rezistor
- 1 gele LED 1
- blauwe LED
- 1 Arduino Uno R3
- 1 böyük LED
- 2 ədəd LED
- 1 məktəbli
- 1 çörək taxtası
- 1 potansiyometr
- 1 protobord
- 1 gitara qəhrəmanı
- Voldoende yataq dəsti
- Lehim materialı/dremelen/
- Schroevendraaier
Addım 1: Komponentlərin verilməsi
Voor ons prototipi (op çörək taxtası) hebben biz komponentləri təqdim edirik:
6 düymə
7 1 kohm rezistor
1 sarı LED
1 Mavi LED
1 Arduino Uno R3
1 Yaşıl LED
2 qırmızı LED
1 Schuifschakelaar
1 Çörək lövhəsi
1 Potansiyometr
Addım 2: Bouwen prototipi
Çörək bişirmə funksiyasını yerinə yetirərkən, çörək lövhəsini sınamaqla yanaşı, həm də testdən keçdiyimiz müddətdə biz də bir araya gələrək prototip hazırlayırıq. Tinkercad.com vasitəsi ilə bir prototip hazırladıqdan sonra, bu prototipin ən böyük prototipi haqqında məlumat əldə edə bilərsiniz.
5 düyməni basdıqdan sonra bütün düymələr bir -birinə bağlandı və 5 düymənin birləşməsi bir araya gələrək bir araya gələrək bir araya gəldi. Müasir LED-lər də bir-biri ilə qarşılıqlı əlaqə qurmaqla uğurla idarə edilə bilər.
Addım 3: Kod Prototipi
Globale dəyişkəndir
Başlanğıcda, kodun başlanğıcını dəyişdirmək üçün bütün düymələri istifadə edə bilərsiniz.
// zet pin nömrələri mainButton (snaar) və düymələri bir -birindən ayırmaq olar: const int mainButton = A1; // gstar snaar const int lightSensor = A0; const int buttonPin1 = 2; // saylı düymələr1 const int buttonPin2 = 3; // düyməni basmaq üçün düymələr2const int buttonPin3 = 4; // düymələri basmaq3const int buttonPin4 = 5; // basma düymələri4const int buttonPin5 = 6; // nummer van düyməsi5
Tıklayacağınız seriallar ən çox istifadə edilə bilən düymələrdir.
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};
LED -lərin quraşdırılması üçün heç bir problem yoxdur.
const int ledPin1 = 13; // LED pininin sayı 13
const int ledPin2 = 12; // LED pininin sayı 12 const int ledPin3 = 11; // LED pininin sayı 11 const int ledPin4 = 10; // LED pininin sayı 10 const int ledPin5 = 9; // LED pininin sayı 9 const int potPin = A5; // LED pin A5 sayı
Ştatların "sensorlar" ı da (dünya potensialiometrinin, lichtsensorun istifadə etdiyi düymələr) dəyişə bilər.
// startiseer buttonStates və ya knoppen (niet of data) int mainButtonState = 0; int düyməsiState1 = 0; int düyməsiState2 = 0; int düyməsiState3 = 0; int düyməsiState4 = 0; int düyməsiState5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;
Qurmaq
Void quraşdırma funksiyasını ləğv edin. Təlimatlar təlimatlarda göstərildiyi kimi, hər hansı bir növ boşluq (boşluq) kimi tanınır.
Başlanğıc funksiyasını şərh etmək çox vacibdir. Xüsusi funksiyaların icrası ilə bağlı əlavə məlumat, arduino istinadlarında mövcuddur
void setup () {// saniyə başına məlumat sürəti (baud) və ya serial ötürülməsi Serial.begin (9600); // pinMode (ledPin1, ÇIXIŞ) ilə birlikdə LEDPin parametrlərini də başladın; pinMode (ledPin2, Çıxış); pinMode (ledPin3, Çıxış); pinMode (ledPin4, Çıxış); pinMode (ledPin5, Çıxış); // başlanğıc üçün bütün düymələr daxil olmaqla: pinMode (mainButton, INPUT); pinMode (düyməPin1, GİRİŞ); pinMode (düyməPin2, GİRİŞ); pinMode (buttonPin3, GİRİŞ); pinMode (düyməPin4, GİRİŞ); pinMode (düyməPin5, GİRİŞ); pinMode (potPin, GİRİŞ); pinMode (işıq sensoru, GİRİŞ); }
Boş funksiya
Quraşdırma () funksiyasını yerinə yetirmək () funksiyasını yerinə yetirmək üçün təlimatlar daha da pisləşdi.
void loop () {// lees de staat van de pushbuttons uit (niet of ingedrukt) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);
// bütün sıra düymələri statusda
int buttonStates = {buttonState1, buttonState2, buttonState3, buttonState4, buttonState5};
// potensialiometr və ya lichtsensor üçün ən yaxşı məlumat
potValue = analogRead (potPin); lightValue = analogRead (lightSensor);
// bəyannaməçi array mainStates və standaard waarden 0 düym.
int mainStates = {0, 0, 0, 0, 0};
// array aantalKnoppen üzərində döngə
for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // başlanğıc üçün bütün məlumatlar knopPinnen daxil olmaqla digitalRead (knopPinnen ); // lees de waarde van alle knoppinnen uit // indien de mainswitch (snaar) istifadə edərək, bütün düymələri çap edin, əgər bütün düymələri göstərin (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}
Addım 4: Uittesten prototipi
Gebouwd prototipi, geschreven kodunun işlənməsindədir, bu da bir prototipdir. Videonun bütün növləri bir -biri ilə əlaqə qurmaqla bir araya gələrək bir araya gətirir.
Tweed -də videonun işlənməsi prosesində pisləşən potensialiometrlər istifadə olunur.
Addım 5: "Ontmantelen" lərlə tanış olun Komponentlər Gebruikt Gaan Worden
Əlavə olaraq düzgün bir prototip əldə etdikdən sonra Guitar Qəhrəmanı "ontmantelen" ilə tanış olduq. Biz bütün proqramları bir -birimizə bağladıqdan sonra bütün elementləri idarə edə biləcəyik. Əlavə olaraq, düymələrin ən yaxşı düymələrini öz üzərimizdə saxlayırıq (zımbalar). Biz bu məhsulu çıxarmaq üçün ən çox istifadə olunan məhsulu (bir düyməni bir araya gətirməklə bir yerdə) bir araya gətiririk (bu şəkil). LED -lərin nə vaxt veriləcəyini (bütün məlumatların düzgünlüyünü başa düşdükdən sonra).
Addım 6: Wineing Originele Buttons + Dremelen
Videonun ən çox yayılmış variantı, bütün əlaqələrin birləşməsi ilə əlaqədardır.
Şəxsi düymələr bir çox mənbələrdə görünsə də, biz də bir çox məlumat əldə edə bilərik.
Addım 7: Yataq Yandırma + Düymələr Vastlijmen
Biz nə vaxt başa düşdük ki, çörək taxtası bir neçə aydan çox müddətə başa çatdı və bu, bir çox komponentləri bir araya gətirdi. Nadat dit gebeurd, biz də düymələri genişləndiririk və bu da fotoşəkillərdir. Eins dit gebeurd, biz heç bir şeyi bağlaya bilmərik.
Addım 8: De Behuizing -də Maken ilə Plaats
Guitar Qəhrəmanı-model redaktə olundu ki, bu da çox yaxşı idi, biz də əlavə edə bilərik. dremelen. Bu gündən etibarən biz bu proqramların hamısını çox yaxşı başa düşə bilərik. Bilmək lazım deyilsə, biz də çox vaxt bu işin öhdəsindən gələ bilərik, biz də çox yaxşı bir iş görürük. Bu fotoşəkil ən çox məlumat əldə edə biləcəyiniz bir vaxtdır ki, bu düymələr heç bir yerdə yoxlanılmamışdır. Bu fotoşəkil ən çox yayılmış məlumatlardan biridir ki, bu da Arduino qapılarının açılması ilə əlaqədardır.
Addım 9: Bedrading Aansluiten Op Protobord
Komponentlər bir -birindən fərqlənir ki, bu protokoldur. Bu məlumatların hamısı, bir qayda olaraq, çörək bordoru ilə daha yaxşı işləyəcəkdir. Şəkillərin ən çox yayılmış şəkillərini də oxuya bilərik. Şəxsi məlumatların verilişini ən yaxşı şəkildə başa çatdırmaq olar (şəkil 2).
Addım 10: Verstevigen
Əlbətdə ki, hər şey son dərəcə sabitdir. Fotoşəkillərin çox böyük bir hissəsi var və biz bu məlumatları əldə edə bilərik. düymələri açdıqdan sonra düymələri yığın.
Addım 11: Kod Voor Het Communiceren Reaper ilə tanış oldu
Deze kodu açıq şəkildə göstərilir, lakin geyim de arduino IDE -də (interaktiv inkişaf mühiti) mövcuddur. İstifadəçi məlumatlarını yoxlamaq üçün hər hansı bir sensoru və ya midi nəzarətçisini yoxlayın.
Qenerasiya hər şeydən ibarətdir. Bütün bunlar Arduino qapılarını açmaq üçün qapını açmaq üçün lazım olan hər şeyi göstərir.
Arduino
/* Bu kod, Seri ilə İşləmə ilə əlaqə qurmaq üçün əsas bir eskizdir.
Öz kodunuzu qoya biləcəyiniz bir plandır
öz düymələriniz, potensiometrləriniz və ya sensorlarınız üçün nəzərdə tutulmuşdur.
Əlaqə qurduğumuzdan əmin olmaq üçün əl sıxışması var
və hansı ünsiyyətdə olduğumuza qərar verilir
Mesajı eyni şəkildə qurmaq vacibdir, belə ki, Qenerasiya onu sökməyi və DAW-a düzgün OSC mesajlarını göndərməyi bilir
werkcollege AV&IT üçün hazırlanmışdır
oktyabr 2017
*
/ baud dərəcəsi
const long baudRate = 115200;
// sancaqlar arasındakı sorğular arasında ms -də gözləmə vaxtı
const int loopPauseTime = 200; // milli saniyə
// Serialda göndərilən mesajın başlanğıc və bitiş dəyərləri
const String startString = "*", endString = "#";
const char contactCharacter = '|';
// pin identifikatorları
// digər qlobal dəyişənlər
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;
// analoq sensorlar
const int potPin = A5; // tremolo ilə vurun
// İşləmə eskizi ilə əlaqə qurmaq üçün bu funksiyaya ehtiyacımız var
// Burda saxlayın void installContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // simvol göndər və cavab gözlə… gecikmə (loopPauseTime); } Serial.read (); }
boş quraşdırma () {
// bütün pinlər üçün pinModları təyin edin (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // 5V əvəzinə 3V üzərində işləyən sensorlar istifadə etsəniz şərh verməyin // 'ext' pinini 3.3V -ə də bağlamalı olacaqsınız // analogReference (EXTERNAL);
// Serial komutlarını işə salın
Serial.begin (baudRate); while (! Serial); // əl sıxmağı gözləyin installContact (); }
boşluq döngəsi () {
// ADIM 1: DÜĞMƏLƏRİ OXUYUN // bütün sancaqlar arasında sorğu keçirin və oxunuşu int buttonStates [aantalKnoppen] uyğun aralığına uyğunlaşdırın; /* 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); // nümunələr: // float v0 = xəritə (bpm, 0, 1023, 60, 250); // normallaşdırılmış float (məsələn, həcm üçün) istifadə etmək istəyirsinizsə // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;
// ADIM 2: MESAJ YAZ
Serial.print (startString); // (int i = 0; i <aantalKnoppen; i ++) {if (mainButtonState == HIGH) {Serial.print (namenKnoppen ) üçün bir mesaj sırasına başlayın; Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }} başqa {buttonStates = 0; Serial. çap (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Serial.print (","); Serial.print (xəritə (potValue, 0, 1023, 0, 100)); // mesajın sonunu yazın Serial.print (endString);
// biraz gözlə..
gecikmə (loopPauseTime); }
İşlənilir
İmtina etmə: Necə deyilsə də, işləmə eskizini hazırlayın, bu kod ən yaxşı şəkildə: ProcessingSoundControl_handout_v6_1.pde formatında
Təlimatlar çox pisdir (indien nodig):
// Baudrate moet hetzelfde zijn zoals in arduino eskizində
final int baudRate = 115200;
// Oraqdakı IP ünvanı (zij ekran görüntüsü)
// İşlənib hazırlanır və indi ən çox yeyilir //
// final String remoteIP = "192.168.1.43"; // məsələn. "127.0.0.1";
final String remoteIP = "10.3.209.60";
// sendPort -a diqqət yetirin və bunu Reaper -də doldurun.
// Bu, İşlənmənin göndərdiyi və Oraqlının dinlədiyi portdur.
final int listenPort = 12000, sendPort = 12000;
// Buradakı listenPort aktiv olaraq debug etmək üçündür.
// portNames də debug etmək üçün buradadır.
// son String portName = "/dev/ttyACM0";
final String portName = "COM5"; // "/dev/ttyUSB0";
//////////////////////////////////////////////////////////////////////////////////////////////////// ////
idxal emalı.serial.*;
java.util idxal edin.*;
idxal oscP5.*;
netP5 idxal edin.*;
OscP5 oscP5;
NetAddress myRemoteLocation;
Serial commsPort; // Serial limanı
boolean messageArrived = false;
Gələn sətir = "", GələnOSCMessage = "";
final char startChar = '*', endChar = '#'; final char contactCharacter = '|';
// Yalnız dəyişən parametrləri (dəyərləri) göndərdiyimizdən əmin olmaq üçün
// bu qlobal dəyişənlər burada silinir, lakin // burada işə salınmamalıdır! HashMap oldParams, newParams, toSendParams;
// Mesajı hər vergüldə bölməliyik
void processIncoming () {String resVec = incoming.split (","); // ad+dəyər cütləri alırıq // hər ad üçün (+2)… cəhd edin {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+) 1]); // onları yeni Hashtable newParams.put'a qoyun (resVec , dəyər); }} // bir səhv olarsa, onu göstərək və çıxaq. catch (Exception ex) {println ("İstisna Mesajı:" + ex); printArray (resVec); çıxış (); }}
// Mesajlarımızı süzmək üçün
/ * Giriş mesajı (Serial) dəyişəndə * Yalnız OSC-dən çıxan bir mesaj olduğuna əminik. Yəni: düyməni çevirsək/bassaq və dəyəri dəyişərsə. * Beləliklə, əslində dəyişən daxil olan dəyərləri süzgəcdən keçiririk * qeyd: məsələn, sürətləndiricilərdən və ya məsafə sensorlarından gəldiyimiz kimi dəyərlərin atlanmasından qaçmayacağıq * bunları Arduino -da özünüz düzəltməlisiniz */ void filterParams () {toSendParams = new HashMap (); for (String key: newParams.keySet ()) {// əgər açar artıq mövcuddursa (oldParams.containsKey (key)) {// açar mövcuddursa və dəyəri eyni deyilsə, (! oldParams.get (key)). bərabərdir (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} başqa {// açar köhnə parametrlərdə yoxdur, belə deyək! toSendParams.put (açar, newParams.get (açar)); } oldParams.put (açar, newParams.get (açar)); }}
boşluq makeOSC () {
for (String düyməsi: toSendParams.keySet ()) {OscMessage myMessage = yeni OscMessage ("/"+ düyməsi); myMessage.add (toSendParams.get (açar)); / * mesaj göndər */ oscP5.send (myMessage, myRemoteLocation); }}
void translateMessage () {
processIncoming (); filterParams (); makeOSC (); } // HashMap mətnində göstərildiyi kimi daxil olan mesajı görmək üçün void ShowIncoming () {// pəncərəsinə çap etmək istədiyimiz zaman ("Arduinodan Gələnlər", 20, 20); int y = 20; for (String düyməsi: newParams.keySet ()) {y = y+20; mətn (açar, 20, y); mətn (newParams.get (key), 300, y); }}
boşluq showOsc () {
mətn (IncomingOSCMessage, 300, 200); GələnOSCMessage = ""; }
boş quraşdırma () {
ölçü (1000, 800); // Mərhələ ölçüsünün doldurulması (255); fon (0); oldParams = yeni HashMap (); newParams = yeni HashMap (); // printArray (Serial.list ()); commsPort = yeni Serial (bu, portName, baudRate);
/ * oscP5 -ə başlayın, gələn mesajları dinləyin */
oscP5 = yeni OscP5 (bu, listenPort);
/* myRemoteLocation bir NetAddressdir. bir NetAddress 2 parametr alır
* bir ip ünvanı və liman nömrəsi.myRemoteLocation, osc paketlərini başqa bir kompüterə, cihaza, * tətbiqə göndərərkən * oscP5.send () də parametr kimi istifadə olunur. istifadəsi aşağıya baxın. test məqsədləri üçün dinləmə limanı * və uzaq yer ünvanı portu eynidir, buna görə də * bu eskizə mesaj göndərəcəksiniz. */ myRemoteLocation = yeni NetAddress (remoteIP, sendPort); }
boş çəkmə () {
if (messageArrived) {background (0); translateMessage (); ShowIncoming (); messageArrived = yalan; } showOsc (); }
boş serialEvent (Serial commsPort) {
// serial portdan bir bayt oxuyun: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // daha çox println istəyin ("başlayır…"); fasilə; case startChar: gələn = ""; fasilə; case endChar: messageArrived = true; // println ("msg -nin sonu"); fasilə; standart: daxil olan += inChar; fasilə; }}
/* gələn osc mesajı oscEvent metoduna göndərilir. */
void oscEvent (OscMessage theOscMessage) {float dəyəri = theOscMessage.get (0).floatValue (); // birinci oscar arqumentini əldə edin
GələnOSCMessage += "\ n" +
String.format ("### bir osc mesajı aldı:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", dəyər); println (IncomingOSCMessage); }
Addım 12: Nəzarətçi Uittesten
Bütün bunlar bir -birindən fərqlidir, bütün kodlar hamısı birdən -birə yoxlanılırsa, bu da nəzarətçi tərəfindən yoxlanılır. Güc Qəhrəmanı MIDI Nəzarətçisindən Reaper -in ən təsirli oyunlarından biridir!
Tövsiyə:
Zoom -u idarə etmək üçün gitara qəhrəmanı gitara istifadə etmək (yalnız Windows): 9 addım
Gitara Qəhrəmanı Gitara Zoom İdarə etmək üçün (Yalnız Windows): Qlobal bir pandemiya içərisində olduğumuz üçün bir çoxumuz evdə təmizlikdə və Zoom -da görüşlərə qatılırıq. Bir müddət sonra bu çox yumşaq və yorucu ola bilər. Evimi təmizləyərkən içərisinə atılmış köhnə bir Gitar Qəhrəmanı gitara tapdım
Gitara Qəhrəmanı Gitara Ayırma Düzeltmesi: 5 Addım (Şəkillərlə birlikdə)
Gitara Qəhrəmanı Gitara Ayırıcı Düzeltme: Beləliklə, ebaydan o gözəl istifadə olunan gitara qəhrəmanı gitarı aldınız və sizə çatanda o USB dongle -a qoşulmayacaq, buna görə də 30 və avro boşa getdiyinizi düşünürsünüz; drenajdan aşağı. Ancaq bir düzəliş var və bu düzəliş çox güman ki işləyəcək
Gitara Qəhrəmanı Klonu: 7 addım (şəkillərlə birlikdə)
Guitar Hero Clone: Heç öz kompüterinizdə Guitar Hero oynamaq istəmisinizmi? 10 dollardan az və biraz səbr üçün oynamağa hazır olun
Daxili Dinamikli Gitara Qəhrəmanı Gitara: 8 addım
Daxili Dinamikli Gitara Qəhrəmanı Gitara: Əsasən bir Gitara Qəhrəmanı idarəedicisini açdım və içərimə nə sığa biləcəyimi düşündüm. Yüngül görünürdü, buna görə çox yer olduğunu anladım. Əlbəttə ki, çox şey var idi. Əvvəlcə gitaranın boynuna iPod Shuffle qoymağı planlaşdırırdım
OpenChord.org V0 - Real Gitara Gitara Qəhrəmanı/Rok qrupu nəzarətçisi qurun: 10 addım
OpenChord.org V0 - Real Gitara Gitara Qəhrəmanı/Rok Qrupu Nəzarətçisi yaradın: Hamımız Gitara Qəhrəmanı və Rok Qrupunu sevirik. Həm də bilirik ki, əslində bu oyunları oynayanda gitar çalmağı öyrənməyəcəyik. Bəs ən azı əsl gitara istifadə etməyimizə imkan verən Guitar Hero nəzarətçi qura bilsək nə olar? OpenChord -da etdiyimiz budur