Mündəricat:

Python və Arduinoda MIDI Drum Kit: 5 Addım (Şəkillərlə birlikdə)
Python və Arduinoda MIDI Drum Kit: 5 Addım (Şəkillərlə birlikdə)

Video: Python və Arduinoda MIDI Drum Kit: 5 Addım (Şəkillərlə birlikdə)

Video: Python və Arduinoda MIDI Drum Kit: 5 Addım (Şəkillərlə birlikdə)
Video: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Noyabr
Anonim
Image
Image
Python və Arduino -da MIDI Davul Kiti
Python və Arduino -da MIDI Davul Kiti
Python və Arduino -da MIDI Davul Kiti
Python və Arduino -da MIDI Davul Kiti

Uşaqlıqdan həmişə nağara dəsti almaq istəmişəm. O vaxtlar, bütün musiqi cihazlarında bütün rəqəmsal tətbiqlər yox idi, çünki bu gün çox şey var, buna görə də gözləntilərlə yanaşı qiymətlər də çox yüksək idi. Bu yaxınlarda eBay -dən ən ucuz nağara dəsti almağa qərar verdim, onu üstün tuturam: onu parçalamaq və öz avadanlıqlarımı və proqramlarımı cihaza bağlamaq bacarığı.

Alqı-satqı heç də məyus olmadı: 9 fərqli səs yastığı olan portativ baraban dəsti, zərb alətləri və hi-papaq üçün iki ayaq keçid pedalı və mikro USB priz. Həqiqətən ruhdan düşən şey, çıxış səsləridir (Bu dəst üçün əsl istifadə xarici dinamikləri bağlamaq və bundan zövq almaqdır). Beləliklə, lazımlı istifadə və həcm, qeyd və kanal seçimləri kimi asan dəyişikliklər üçün USB, Arduino əsaslı MIDI nağara dəsti və Python əsaslı İstifadəçi İnterfeysi vasitəsi ilə öz proqramlaşdırıla biləcəyimə çevirmək qərarına gəldim.

Cihazın xüsusiyyətləri:

  • Aşağı qiymət
  • İstənilən rəqəmsal girişdən baraban dəsti yaratmaq - hətta bir çox düymələr
  • Yalnız USB interfeysi ilə ünsiyyət dəstəyi və enerji təchizatı - USB -nin UART çeviricisinə və Arduino cihazına inteqrasiyası
  • Düzgün işləməsi üçün mininin hissələri
  • İstifadəsi asan Python əsaslı UI
  • Ayarlanabilir sürət, qeyd və Arduino pinləri ilə tam MIDI dəstəyi
  • Cihazın yaddaşında saxlanılan xüsusi nağara konfiqurasiyalarını saxla və yüklə

Layihəyə davam edək …

Addım 1: Əməliyyat nəzəriyyəsi

Əməliyyat nəzəriyyəsi
Əməliyyat nəzəriyyəsi
Əməliyyat nəzəriyyəsi
Əməliyyat nəzəriyyəsi
Əməliyyat nəzəriyyəsi
Əməliyyat nəzəriyyəsi

Blok diaqram

Əvvəlcə layihə quruluşuna diqqət yetirək və onu ayrı bloklara ayıraq:

Roll-Up Baraban dəsti

Layihənin əsas vahidi. Hər bir pad vurulduqda məntiq vəziyyətlərini dəyişdirən bir sıra düymələr olduğu 9 ayrı baraban yastiqciyindən ibarətdir. Quruluşuna görə, hər hansı bir düymədən bu xüsusi davul dəstini qurmaq imkanı var. Hər bir baraban yastığı əsas elektron lövhədəki çəkmə müqavimətçisinə bağlıdır, buna görə də baraban yastığı dəfələrlə vurularkən, müəyyən bir keçid dövrə torpağına bağlanır və tambur pad xəttində məntiqi LOW mövcuddur. Heç bir təzyiq tətbiq edilmədikdə, baraban yastığı açarı açıqdır və elektrik xəttinə çəkmə müqaviməti səbəbindən, baraban yastığı xəttində məntiqi YÜKS mövcuddur. Layihənin məqsədi tam bir rəqəmsal MIDI cihazı yaratmaq olduğundan, əsas PCB üzərindəki bütün analog hissələr laqeyd edilə bilər. Baraban dəstinin çəkmə rezistorlarına bağlanan və bütün baraban yastıqları ilə eyni əməliyyat məntiqini bölüşdürən zərb alətləri və hi-papaq üçün iki pedalı olduğunu nəzərə almaq vacibdir (Bir az sonra müzakirə edəcəyik.).

Arduino Pro-Micro

Baraban dəstinin beyni. Məqsəd, bir baraban yastığından bir siqnalın olub olmadığını aşkar etmək və bütün lazımi parametrlərlə uyğun MIDI çıxışı təmin etməkdir: Qeyd, siqnalın sürəti və müddəti. Baraban yastıqlarının rəqəmsal təbiəti səbəbindən sadəcə arduino rəqəmsal girişlərinə bağlana bilər (cəmi 10 pin). İstədiyiniz bütün parametrləri və MIDI məlumatlarını saxlamaq üçün onun yaddaşını-EEPROM-dan istifadə edəcəyik, buna görə cihazı hər dəfə işə salanda MIDI məlumatı EEPROM-dan yüklənərək yenidən proqramlaşdırıla və yenidən konfiqurasiya oluna bilər. Ayrıca, Arduino Pro-Micro çox kiçik bir paketdə mövcuddur və baraban dəstinin daxili qutusunda asanlıqla ayrılır.

FTDI USB -dən Serial Dönüştürücü

PC tətbiqinin köməyi ilə cihaz xüsusiyyətlərimizi proqramlaşdırmaq və təyin etmək üçün USB interfeysini seriala çevirmək lazımdır, çünki Arduino Pro-Micro-da USB yoxdur. Cihazlar arasında ünsiyyət UART -a əsaslandığından, əlavə xüsusiyyətlərindən asılı olmayaraq istifadəsinin sadəliyi səbəbindən FTDI cihazı bu layihədə istifadə olunur.

PC tətbiqi - Python

İstifadəçi interfeyslərinin və sürətli qurulan layihələrin inkişafına gəldikdə, Python əla bir həlldir. UI tətbiqinin məqsədi, baraban dəstimiz üçün MIDI xüsusiyyətlərini yenidən təyin etməyi, məlumatı, proqram cihazını saxlamağı və kodu təkrar -təkrar yığmağa ehtiyac olmadan sistemlər arasında ünsiyyət qurmağı daha rahat etməkdir. Baraban dəsti ilə ünsiyyət qurmaq üçün serial interfeysindən istifadə etdiyimiz üçün internetin hər tərəfində hər cür serial ünsiyyətini dəstəkləyən bir çox pulsuz modul var. Bundan əlavə, daha sonra müzakirə ediləcəyi kimi, UART interfeysi cəmi üç pindən ibarətdir: RXD, TXD və DTR. DTR, Arduino modulunda sıfırlama aparmaq üçün istifadə olunur, buna görə də MIDI tətbiqini işə salmaq və ya UI -ni proqram cihazına bağlamaqla maraqlandığımız zaman USB kabelini və ya başqa bir şeyi yenidən bağlamağa ehtiyac yoxdur.

Addım 2: Parçalar və Alətlər

Hissələri

  • Roll-Up Baraban dəsti
  • 2 x Davamlı Pedallar (Adətən DK paketinə daxildir).
  • FTDI - USB -dən Seriya çeviricisi
  • Arduino Pro Micro
  • Mikro USB Kabel

Alətlər

  • Lehimləmə Dəmir/Stansiya
  • Lehimləmə Qalay
  • İncə Çaplı Tək Nüvəli tel
  • Cımbız
  • Kəsici
  • Pense
  • Bıçaq
  • Vida Sürücü
  • 3D Yazıcı (İsteğe bağlı - xüsusi pedal platformaları üçün)

Proqram təminatı

  • Arduino IDE
  • Python 3 və ya daha yüksək
  • JetBrains Pycharm
  • Tüksüz MIDI interfeysi
  • loopMIDI

Addım 3: Lehimləmə və montaj

Lehimləmə və montaj
Lehimləmə və montaj
Lehimləmə və montaj
Lehimləmə və montaj
Lehimləmə və montaj
Lehimləmə və montaj

Birləşdirilməli olan üç modul olduğundan, lehimləmə və montaj prosesi qısa və sadədir:

  • Arduino Pro-Micro-nu FTDI cihazı ilə birləşdirin, əlaqələrin hər cihazda müəyyən edilmiş I/O-ya uyğun olduğundan əmin olun:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Baraban plastik korpusundakı bütün vintləri çıxarın, diqqətlə pad-to-board kabelinə və çəkmə rezistorlarına diqqət yetirin.
  • Daha əvvəl qurduğumuz Arduino-FTDI modulu üçün lehim nazik telləri:

    • Rəqəmsal girişlər: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Modulu batareyanın korpusuna daxil edin ki, tellər yastıqların çəkmə rezistorları ilə eyni tərəfdə üzsün.
  • Son rəqəmdə göstərildiyi kimi bütün rəqəmsal girişləri tambur yastığı terminallarına lehimləyin.
  • FTDI cihazına mikro USB avtobusunu (VBUS, D+, D-, GND) lehimləyin, bu telləri izləməkdə heç bir səhv olmadığından əmin olun.
  • Arduino-FTDI modulunu isti yapışqan ilə batareya qutusuna yapışdırın
  • Cihazı uyğun vintlər ilə bağlayın

Bunu etdik, cihaz yığılır. Koda davam edək …

Addım 4: Proqramlaşdırma A: Arduino

Proqramlaşdırma A: Arduino
Proqramlaşdırma A: Arduino

Eskizimizi addım-addım təsvir edək:

İlk növbədə, düzgün işləməsi üçün iki lazımlı kitabxananın daxil edilməsi lazımdır. EEPROM artıq Arduino IDE-də əvvəlcədən quraşdırılmışdır, lakin zərb alətləri üçün debitor modulu ayrıca quraşdırılmalıdır

#daxil edin #daxil edin

Bu açarlar əsasən ayıklama sıralarında istifadə olunur. Arduino terminallarının baraban yastıqları ilə əlaqəsini sınamaq və bütün rəqəmsal girişləri təyin etmək istəyirsinizsə, bu açarlar müəyyən edilməlidir

/ * Geliştirici Keçidləri: Ayıklama və ya başlatma üçün istədiyiniz rejimi şərh etməyin * ///#LOAD_DEFAULT_VALUES təyin edin // EEPROM əvəzinə sabit dəyərlər yükləyin //#PRINT_PADS_PIN_NUMBERS təyin edin // Seriya portu ilə vurulmuş yastığa bağlı pin nömrəsini çap edin.

Sabit sahələr, baraban sayğacı da daxil olmaqla bütün standart dəyərləri təmsil edir. Cihazı ilk dəfə işə salmaq üçün Hi-Hat və Kick pedallarının dəqiq bağlantısını bilmək lazımdır

/ * Tambur tipli sayım */

DRUM_POSITION {KICK = 0, SNARE, HIHAT, RIDE, CYMBAL1, CYMBAL2, TOM_HIGH, TOM_MID, TOM_LO, HIHAT_PEDAL};

/ * Varsayılan dəyərlər */

const uint8_t DRUM_NOTES [10] = {36, 40, 42, 51, 49, 55, 47, 45, 43, 48}; const uint8_t DRUM_VELOCITIES [10] = {110, 100, 100, 110, 110, 110, 110, 110, 110, 110}; const uint8_t DRUM_PINS [10] = {8, 6, 4, 3, 11, 9, 5, 10, 2, 7};

/ * Tamburdan çıxma müddəti */

const uint8_t KICK_DB_DURATION = 30;

EEPROM, PC tətbiqindən gələn bütün məlumatları saxlamaq/yükləmək üçün istifadə olunur. Yuxarıda təsvir olunan ünvanlar, hər bir baraban yastığı üçün MIDI məlumatının dəqiq yerini göstərir

/* EEPROM Ünvanların xəritələndirilməsi

Qeydlər: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |

Sancaqlar: | 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 | Sürətlər | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23 | */ const uint8_t NOTES_ADDR = 0x00; const uint8_t VELOCITIES_ADDR = 0x14; const uint8_t PINS_ADDR = 0x0A;

Qlobal dəyişənlər hər bir pad vəziyyətini təyin etmək və buna uyğun olaraq MIDI əlaqəsini yerinə yetirmək üçün istifadə olunur

/ * Qlobal Dəyişənlər */

uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // MIDI Dəyişənləri

uint8_t uartBuffer [64]; // MIDI Data Debouncer vuruşunun toplanması və saxlanması üçün UART Tamponu (DRUM_PINS [KICK], KICK_DB_DURATION); // Kick baraban üçün uçucu bool previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Davul pad əvvəlki məntiq dəyişkən bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Drum pad cari məntiq vəziyyətləri

EEPROM funksiyaları

/* Ayarları EEPROM -da saxlayın*/

boş mağazaEEPROM () {

memcpy (drumNotes, uartBuffer, 10); memcpy (drumPins, uartBuffer + 10, 10); memcpy (drumVelocities, uartBuffer + 20, 10); for (uint8_t i = 0; i <10; i ++) EEPROM.write (NOTES_ADDR+i, drumNotes ); üçün (uint8_t i = 0; i <10; i ++) EEPROM.write (PINS_ADDR+i, drumPins ); for (uint8_t i = 0; i <10; i ++) EEPROM.write (VELOCITIES_ADDR+i, drumVelocities ); }

/* Ayarları EEPROM -dan yükləyin*/

void loadEEPROM () {for (uint8_t i = 0; i <10; i ++) drumNotes = EEPROM.read (NOTES_ADDR+i); üçün (uint8_t i = 0; i <10; i ++) drumPins = EEPROM.read (PINS_ADDR+i); üçün (uint8_t i = 0; i <10; i ++) drumVelocities = EEPROM.read (VELOCITIES_ADDR+i); }

Dəyişənlərin işə salınması və proqramlaşdırma rejimi, pedallar vəziyyətində və Arduino boot eyni vaxtda aktivləşdirilir

void enterProgrammingMode () {

bool confirmBreak = yalan; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; while (! confirmBreak) {if (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); əgər (charCnt> = 29) confirmBreak = doğru; başqa charCnt ++; }} Serial.println ("OK"); mağazaEEPROM (); }

etibarsız initValues () {

#ifdef LOAD_DEFAULT_VALUES memcpy (drumNotes, DRUM_NOTES, 10); memcpy (drumVelocities, DRUM_VELOCITIES, 10); memcpy (drumPins, DRUM_PINS, 10); #başqaEEPROM (); #endif}

1 ms gecikmə ilə MIDI Əlaqə idarəçiləri

/ * MIDI qeyd funksiyasını oynat */

void midiOut (DRUM_POSITION drumIn daxil edin) {

if (drumIn == HIHAT) {// HI-HAT vurulubsa, (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities) [HIHAT_PEDAL]); gecikmə (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } başqa {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); gecikmə (1); noteOn (0x90, drumNotes [HIHAT], 0); }} başqa {// Daimi baraban MIDI ötürmə notuOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); gecikmə (1); noteOn (0x90, drumNotes [drumIn], 0); }}

void noteOn (int cmd, int pitch, int velocity) {Serial.write (cmd); Serial.write (meydança); Serial.write (sürət); }

sonsuz cihaz əməliyyat döngüsü olan setup () və loop () funksiyaları:

boş quraşdırma () {

Serial.begin (115200);

for (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D") üçün sonsuz debug loop; Serial.print (i + '0'); // Nömrəni ASCII simvoluna çevirin}}} #else initValues (); / * Proqramlaşdırma rejimi: Yükləmə zamanı iki pedala basılarsa - rejim aktivləşdirilir */ if (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #endif}

void loop () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); if (! currentState && previousState ) midiOut (i); // Vəziyyətləri müqayisə edin və düşən kənarı aşkarlayın əvvəlkiState = currentState ; } kick.update (); // Kick baraban, əgər (kick.edge ()) if (kick.falling ()) midiOut (KICK); }

Addım 5: Proqramlaşdırma B: Python və İstifadəçi Arayüzü

Proqramlaşdırma B: Python və İstifadəçi İnterfeysi
Proqramlaşdırma B: Python və İstifadəçi İnterfeysi
Proqramlaşdırma B: Python və İstifadəçi İnterfeysi
Proqramlaşdırma B: Python və İstifadəçi İnterfeysi
Proqramlaşdırma B: Python və İstifadəçi İnterfeysi
Proqramlaşdırma B: Python və İstifadəçi İnterfeysi

Python İstifadəçi İnterfeysi ilk baxışdan başa düşmək üçün bir az mürəkkəbdir, buna görə də onun əsaslarını, necə istifadə olunacağını, hər düymənin hansı funksiyaya malik olduğunu və Arduino cihazını necə düzgün proqramlaşdıracağını izah etməyə çalışacağıq.

İstifadəçi İnterfeysi - Tətbiq

İstifadəçi interfeysi, baraban dəsti proqramçımız üçün qrafik bir təqdimatdır, bu da Arduino cihazını istədiyiniz zaman istifadə etməyi çox asanlaşdırır və rahat edir. UI, təklif etdikləri əməliyyatla əlaqəli bir neçə qrafik moduldan ibarətdir. bunları bir -bir nəzərdən keçirək:

  1. Drum Set Image: Python UI, hansı baraban növünün seçildiyini müəyyən etmək üçün X-Y görüntü koordinatlarından istifadə edir. Etibarlı baraban bölgəsi seçilsə, qeyd olunan sahələr, sürət və xüsusi baraban yastığı üçün Arduino terminalı ilə ikincil IO mesajı görünür. Bu parametrlər istifadəçi tərəfindən təsdiqləndikdən və təsdiq edildikdən sonra bu dəyərlər birbaşa Arduino cihazına ötürülə bilər.
  2. Xarici Nəzarətçi Şəkli: VST/Musiqi yaradan mühitlə MIDI baraban dəstindən istifadə edə bilmək üçün Serial-MIDI tərcüməçisini işə salmaq lazımdır. Pulsuz olaraq mövcud olan və yalnız şəklinə basaraq UI -dən birbaşa işlədilə bilən Hairless istifadə etdim.
  3. COM Port Siyahısı: Arduino ilə ünsiyyət qurmaq üçün ona əlavə edilmiş COM portunu göstərməlisiniz. Yeniləmə düyməsinə basaraq siyahı yenilənir.
  4. Yükləmə/Konfiqurasiyanı Saxla: Kodda müəyyən edilmiş standart bir MIDI dəyərləri var, istifadəçi tərəfindən UI ilə qarşılıqlı əlaqə quraraq dəyişdirilə bilər. Konfiqurasiya, istifadəçi tərəfindən saxlanıla və ya yüklənə bilən xüsusi bir formatda config.txt faylında müəyyən edilir.
  5. Proqram Cihazı Düyməsi: Bütün dəyişdirilmiş MIDI dəyərlərini Arduino EEPROM-da saxlamaq üçün bundan sonra iki ayaq pedalına (Kick baraban və Hi-hat pedalı) basmaq, məlumat ötürülməsinin tamamlanmasını gözləmək lazımdır. Hər hansı bir ünsiyyət problemi olsaydı, düzgün açılan pəncərə görünəcək. Əgər ötürmə uğur qazansa, UI uğurlu mesajını göstərəcək.
  6. Çıxış Düyməsi: İstifadəçinin icazəsi ilə yalnız tətbiqdən çıxın.

Python kodunun əsas məqamları

Kodda çox şey gedir, buna görə də bütün kodu deyil, yazılı funksiyaları genişləndirəcəyik.

Əvvəlcə UI -dən istifadə etmək üçün kodu işə salmaq üçün bir neçə modul yükləməlisiniz:

osimport iş parçacığı idxal tkinter tkinterdən tkter idxal mesaj qutusu tkinter idxaldan * PIL idxal ImageTk -dən, idxal serial idxal qlob kimi şəkil idxalı numpy

Bəzi modullar standart Python paketinə daxildir. PIP vasitəsi ilə bir neçə modul quraşdırılmalıdır:

pip quraşdırın Yastıq

pip install numpy pip quraşdırma ScreenInfo

Tətbiqi PyCharm vasitəsilə işə salmaq şiddətlə tövsiyə olunur. Gələcək buraxılışlarda, layihə üçün bir icra faylını ixrac etməyi planlaşdırıram.

Kodun qısa izahı

Onun xətlərinə funksiyalar və siniflər baxımından baxsaq kodu anlamaq daha asan olacaq:

1. Əsas funksiya - burada kod başlayır

əgər _ adı_ == '_ ana_' olarsa: drumkit_gui ()

2. Drum Kit sabitləri, koordinatları və standart MIDI məlumatları

sinif Davulları: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal") "," Nəzarətçi "]

COORDINATES_X = [323, 117, 205, 173, 565, 271, 386, 488, 487, 135, 79]

COORDINATES_Y = [268, 115, 192, 40, 29, 107, 104, 190, 71, 408, 208] DIMS_WIDTH = [60, 145, 130, 120, 120, 70, 70, 130, 120, 70, 145] DIMS_LENGTH = [60, 60, 80, 35, 35, 40, 40, 70, 35, 100, 50]

DRUM_ENUM = ["Tekme", "Tələ", "Hihat", "Sürüş", "Çarpışma 1", "Qəza 2", "Tom Yüksək", "Tom Mid", "Tom Aşağı", "Hihat Pedalı"]

DRUM_NOTES = [36, 40, 42, 51, 49, 55, 47, 45, 43, 48] DRUM_VELOCITIES = [110, 100, 100, 110, 110, 110, 110, 110, 110, 110] DRUM_PINS = [8, 6, 4, 3, 11, 9, 5, 10, 2, 7]

3. UI Funksiyaları - İstifadəçi interfeysi və qrafik obyektlərin işlənməsi

def set_active (ui)

def ikincil_ui (baraban_tipi)

sinif SelectionUi (tk. Frame)

sinif tətbiqi (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (hadisə)

def getorigin (özünü, hadisə)

4. Serial ünsiyyət

def get_serial_ports ()

def communication_with_arduino (liman)

5. Fayllarla işləmək: Ayarları txt faylından saxla/yüklə

def save_config ()

def load_config ()

6. Python Threading imkanlarından istifadə edərək koddan hairless.exe xarici tətbiqini işlətmək

sinif ExternalExecutableThread (threading. Thread)

def run_hairless_executable ()

Kodu işə salmaq üçün layihə qovluğuna əlavə edilməli olan faylların siyahısı var:

  • config.txt: Ayarlar faylı
  • hairless.exe: Tüksüz MIDI çeviricisi
  • drumkit.png: İstifadəçi interfeysimizdəki bütün tıklanabilir baraban yastıqlarını təyin edən görüntü (Bu addımın şəkillər dəstindən yüklənməlidir)
  • drumgui.py: Layihə kodu

İşlətmək üçün vurğulamalı olduğumuz hər şey budur. Layihəyə fayllar əlavə etmək çox vacibdir: baraban şəkli, hairless.exe yürütülebilir və config.txt faylları.

Və.. İşdə bitirdik!:)

Ümid edirəm bu təlimatı faydalı tapacaqsınız.

Oxuduğunuz üçün təşəkkürlər!:)

Tövsiyə: