Përmbajtje:

Kit MIDI Drum në Python dhe Arduino: 5 hapa (me fotografi)
Kit MIDI Drum në Python dhe Arduino: 5 hapa (me fotografi)

Video: Kit MIDI Drum në Python dhe Arduino: 5 hapa (me fotografi)

Video: Kit MIDI Drum në Python dhe Arduino: 5 hapa (me fotografi)
Video: Веб-программирование – информатика для руководителей бизнеса 2016 2024, Dhjetor
Anonim
Image
Image
Kit MIDI Drum në Python dhe Arduino
Kit MIDI Drum në Python dhe Arduino
Kit MIDI Drum në Python dhe Arduino
Kit MIDI Drum në Python dhe Arduino

Gjithmonë kam dashur të blej një çantë daulle që kur isha fëmijë. Atëherë, të gjitha pajisjet muzikore nuk kishin të gjitha aplikacionet dixhitale siç kemi sot, kështu që çmimet së bashku me pritjet ishin shumë të larta. Kohët e fundit kam vendosur të blej një çantë më të lirë të daulleve nga eBay, me përparësinë e vetme: Aftësinë për ta shkatërruar atë dhe për të bashkangjitur pajisjen dhe softuerin tim në pajisje.

Blerja nuk ishte aspak zhgënjyese: Kompleti i daulleve me rrotullime të lëvizshëm me 9 tinguj të ndryshëm të tingullit, dy pedale të ndërruesve të këmbëve për daulle goditjeje dhe hi-hat dhe prizë të energjisë micro-USB. Ajo që ishte vërtet demotivuese, janë tingujt e daljes (përdorimi aktual i këtij kompleti është të lidhni altoparlantin e jashtëm dhe ta shijoni atë). Kështu, vendosa ta konvertoj atë në programin tim të programueshëm përmes USB, kompletit të daulleve MIDI bazuar në Arduino dhe Ndërfaqen e Përdoruesit të bazuar në Python, për përdorim të përshtatshëm dhe modifikime të lehta si, vëllimi, shënimet dhe zgjedhjet e kanaleve.

Karakteristikat e pajisjes:

  • Çmim të ulët
  • Krijimi i kompletit të daulleve nga çdo hyrje dixhitale - madje edhe një grup butonash shtytës
  • Mbështetje komunikimi dhe furnizim me energji vetëm përmes ndërfaqes USB - Integrimi i konvertuesit USB në UART dhe pajisjes Arduino
  • Pjesë minimale për funksionimin e duhur
  • UI i lehtë për t’u përdorur me bazë Python
  • Mbështetje e plotë MIDI me shpejtësi të rregullueshme, shënime dhe kunja Arduino
  • Ruani dhe ngarkoni konfigurimet e daulleve të personalizuara të ruajtura në kujtesën e pajisjes

Le të vazhdojmë me projektin…

Hapi 1: Teoria e Operacionit

Teoria e Operacionit
Teoria e Operacionit
Teoria e Operacionit
Teoria e Operacionit
Teoria e Operacionit
Teoria e Operacionit

Bllokimi i Diagramit

Para së gjithash, le të përqëndrohemi në strukturën e projektit dhe ta ndajmë atë në blloqe të veçanta:

Rrum-Up Drum Kit

Njësia kryesore e projektit. Përbëhet nga 9 jastëkë të veçantë daulle, ku secila jastëk është një grup butonash që ndryshojnë gjendjen e tyre logjike gjatë goditjes. Për shkak të strukturës së tij, ekziston mundësia për të ndërtuar këtë çantë të veçantë daulle nga çdo buton shtypës. Çdo jastëk daulle është i lidhur me rezistencën tërheqëse në tabelën kryesore elektronike, kështu që ndërsa jastëku i daulles goditet në mënyrë të përsëritur, një ndërprerës specifik lidhet në tokën e qarkut dhe LOW logjik është i pranishëm në linjën e jastëkut të daulleve. Kur nuk aplikohet presion, çelësi i kazanit të daulles është i hapur dhe për shkak të rezistencës tërheqëse në linjën e energjisë, logjika e Lartë logjike është e pranishme në vijën e kazanit të daulles. Meqenëse qëllimi i projektit është të krijojë një pajisje të plotë dixhitale MIDI, të gjitha pjesët analoge në PCB kryesore mund të neglizhohen. Importantshtë e rëndësishme të vihet re, se kompleti i daulles ka dy pedale për daulle goditjeje dhe hi-hat, të cilat janë gjithashtu të lidhura me rezistorët tërheqës dhe ndajnë të njëjtën logjikë të funksionimit si të gjitha jastëkët e daulles (Ne do ta diskutojmë atë pak më vonë)

Arduino Pro-Mikro

Truri i kompletit të daulleve. Qëllimi i tij është të zbulojë nëse ka një sinjal që del nga një daulle dhe të sigurojë daljen e duhur MIDI me të gjithë parametrat e nevojshëm: Shënim, shpejtësi dhe kohëzgjatje të sinjalit. Për shkak të natyrës dixhitale të tamponëve, ato thjesht mund të lidhen me hyrjet dixhitale arduino (gjithsej 10 kunja). Për të ruajtur të gjitha cilësimet e dëshiruara dhe informacionin MIDI, ne do të përdorim kujtesën e tij-EEPROM, kështu që sa herë që ndezim pajisjen, informacioni MIDI po ngarkohet nga EEPROM, duke e bërë atë të ri-programueshëm dhe të ri-konfigurueshëm. Gjithashtu, Arduino Pro-Micro është në dispozicion në një paketë shumë të vogël dhe mund të ndahet lehtësisht në kutinë e brendshme të kutisë së daulleve.

Konvertuesi FTDI USB në Serial

Për të programuar dhe përcaktuar veçoritë e pajisjes sonë me ndihmën e aplikacionit të kompjuterit, duhet të konvertoni ndërfaqen USB në seriale, sepse Arduino Pro-Micro nuk ka USB. Meqenëse komunikimi midis pajisjeve bazohet në UART, pajisja FTDI përdoret në këtë projekt, për shkak të thjeshtësisë së përdorimit pavarësisht nga vetitë e tij shtesë.

Aplikimi për PC - Python

Kur bëhet fjalë për zhvillimin e ndërfaqeve të përdoruesve dhe projekte të shpejta për t'u ndërtuar, Python është një zgjidhje e shkëlqyeshme. Qëllimi i aplikacionit UI është ta bëjë shumë më të përshtatshëm ripërcaktimin e vetive MIDI për pajisjen tonë të daulleve, ruajtjen e informacionit, pajisjen e programit dhe komunikimin midis sistemeve pa pasur nevojë të përpiloni kodin pa pushim. Për shkak se ne po përdorim ndërfaqe serike për të komunikuar me çantën e daulleve, ka shumë module falas në të gjithë internetin, që mbështesin çdo lloj komunikimi serik. Përveç kësaj, siç do të diskutohet më vonë, ndërfaqja UART përbëhet nga gjithsej tre kunja: RXD, TXD dhe DTR. DTR përdoret për të kryer rivendosjen në modulin Arduino, kështu që kur jemi të interesuar të ekzekutojmë aplikacionin MIDI ose të lidhim UI me pajisjen e programit, nuk ka absolutisht nevojë të lidhim përsëri kabllon USB ose çfarëdo.

Hapi 2: Pjesët dhe Instrumentet

Pjesët

  • Rrum-Up Drum Kit
  • 2 x Pedale të Qëndrueshme (Zakonisht, të përfshira në paketën DK).
  • FTDI - Konvertues USB në Serial
  • Arduino Pro Micro
  • Kabllo Micro-USB

Instrumentet

  • Hekuri/Stacioni i saldimit
  • Kallaji i saldimit
  • Teli me një diametër të hollë me një bërthamë
  • Piskatore
  • Prestar
  • Pincë
  • Thikë
  • Vidhosës
  • Printer 3D (Opsional - për platformat e personalizuara të pedaleve)

Softuer

  • Arduino IDE
  • Python 3 ose më i Lartë
  • JetBrains Pycharm
  • Ndërfaqe MIDI pa flokë
  • lakMIDI

Hapi 3: Saldimi dhe montimi

Saldim dhe montim
Saldim dhe montim
Saldim dhe montim
Saldim dhe montim
Saldim dhe montim
Saldim dhe montim

Meqenëse ekzistojnë tre module që duhet të kombinohen, procesi i bashkimit dhe montimit është i shkurtër dhe i thjeshtë:

  • Bashkoni Arduino Pro-Micro me pajisjen FTDI, sigurohuni që lidhjet të jenë në përputhje me I/O të përcaktuar në secilën pajisje:

    • VBUS-VBUS
    • GND-GND
    • DTR-DTR
    • RXD-TXD
    • TXD-RXD
  • Hiqni të gjitha vidhat nga kutia plastike e daulles, sigurohuni që të mund të përqendroheni në kabllon nga pllaka në bord dhe rezistorët e tij tërheqës
  • Saldoni tela të hollë për modulin Arduino-FTDI që kemi ndërtuar më parë:

    • Hyrjet dixhitale: D [2:11]
    • VBUS
    • D+
    • D-
    • GND
  • Futni modulin brenda kutisë së baterisë në mënyrë që telat të notojnë në të njëjtën anë me rezistorët tërheqës të pads
  • Ngjitini të gjitha hyrjet dixhitale në terminalet e daulleve siç tregohet në figurën e fundit.
  • Lidhni autobusin mikro-USB (VBUS, D+, D-, GND) në pajisjen FTDI, sigurohuni që të mos ketë gabime në gjurmimin e këtyre telave.
  • Bashkoni modulin Arduino-FTDI me ngjitës të nxehtë në kutinë e baterisë
  • Montoni pajisjen me bashkuesin e duhur të vidhave

Ne e kemi bërë atë, pajisja është mbledhur. Le të vazhdojmë me kodin…

Hapi 4: Programimi A: Arduino

Programimi A: Arduino
Programimi A: Arduino

Le të përshkruajmë skicën tonë hap pas hapi:

Para së gjithash, është e nevojshme të përfshihen dy biblioteka të nevojshme për funksionimin e duhur. EEPROM tashmë është para-instaluar në Arduino IDE, por moduli debouncer për daulle goditjeje duhet të instalohet veçmas

#përfshi #përfshi

Këta ndërprerës përdoren kryesisht në sekuencat e korrigjimit. Nëse dëshironi të provoni lidhjen e terminaleve Arduino me tamponët e daulleve dhe të përcaktoni të gjitha hyrjet dixhitale, këto çelsa duhet të përcaktohen

/ * Ndërruesit e Zhvilluesit: Mos komentoni mënyrën e dëshiruar për korrigjimin ose fillimin * ///#përcaktoni LOAD_DEFAULT_VALUES // Ngarkoni vlerat konstante në vend të EEPROM //#përcaktoni PRINT_PADS_PIN_NUMBERS // Shtypni numrin pin që është i lidhur me një bllok të goditur përmes portit serik

Fushat konstante përfaqësojnë të gjitha vlerat e paracaktuara, duke përfshirë numërimin e tamponit. Për të drejtuar pajisjen për herë të parë, duhet të dini lidhjen e saktë të pedaleve Hi-Hat dhe Kick

/ * Numërimi i tipit të daulles */

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

/ * Vlerat e paracaktuara */

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};

/ * Kohëzgjatja e kërcimit të daulles së goditjes */

const uint8_t KICK_DB_DURATION = 30;

EEPROM përdoret për të ruajtur/ngarkuar të gjitha të dhënat që vijnë nga aplikacioni i kompjuterit. Hapësira e adresave e përshkruar më sipër, tregon vendndodhjen e saktë për informacionin MIDI për secilën jastëk daulle

/* Hartimi i adresave EEPROM

Shënime: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |

Kunjat: | 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 | Shpejtësi | 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;

Variablat globale përdoren për të përcaktuar gjendjen e secilës jastëk dhe për të kryer komunikimin MIDI në përputhje me rrethanat

/ * Variablat Global */

uint8_t daulleNotes [10], daulleVelocities [10], drumPins [10]; // Ndryshoret MIDI

uint8_t uartBuffer [64]; // Tampon UART për mbledhjen dhe ruajtjen e goditjes së Debouncer të të dhënave MIDI (DRUM_PINS [KICK], KICK_DB_DURATION); // Objekt debouncer for kick drum volatile bool previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Log daulle gjendjet e mëparshme logjike gjendja e paqëndrueshme e bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Gjendja logjike aktuale e daulles

Funksionet EEPROM

/* Ruaj cilësimet në EEPROM*/

void storeEEPROM () {

memcpy (shënimet e daulles, uartBuffer, 10); memcpy (drumPins, uartBuffer + 10, 10); memcpy (daulleVelocities, uartBuffer + 20, 10); për (uint8_t i = 0; i <10; i ++) EEPROM.shkruaj (NOTES_ADDR+i, daulleNotes ); për (uint8_t i = 0; i <10; i ++) EEPROM.shkruaj (PINS_ADDR+i, drumPins ); për (uint8_t i = 0; i <10; i ++) EEPROM.shkruaj (VELOCITIES_ADDR+i, daulleVelocities ); }

/* Ngarkoni cilësimet nga EEPROM*/

ngarkesë e pavlefshmeEEPROM () {për (uint8_t i = 0; i <10; i ++) daulle Shënime = EEPROM.lexo (NOTES_ADDR+i); për (uint8_t i = 0; i <10; i ++) drumPins = EEPROM.lexim (PINS_ADDR+i); për (uint8_t i = 0; i <10; i ++) daulleVelocities = EEPROM.lexo (VELOCITIES_ADDR+i); }

Fillimi i variablave dhe mënyra e programimit, në rastin e pedaleve dhe boot Arduino aktivizohen njëkohësisht

void enterProgrammingMode () {

bool confirmBreak = false; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; ndërsa (! confirmBreak) {if (Serial.disponueshëm ()) {uartBuffer [charCnt] = Serial.read (); if (charCnt> = 29) confirmBreak = true; tjetër charCnt ++; }} Serial.println ("OK"); storeEEPROM (); }

void initValues () {

#ifdef LOAD_DEFAULT_VALUES memcpy (shënimet e daulles, DRUM_NOTES, 10); memcpy (daulleVelocities, DRUM_VELOCITIES, 10); memcpy (drumPins, DRUM_PINS, 10); #ngarkesë tjetërEEPROM (); #endif}

Trajtuesit e komunikimit MIDI me vonesë prej 1ms kohë të mbajtjes së shënimeve

/ * Luaj funksionin e shënimit MIDI */

void midiOut (enum DRUM_POSITION drumIn) {

nëse (drumIn == HIHAT) {// Nëse HI-HAT është goditur, është e nevojshme të bëhet një kontroll nëse pedali shtypet nëse (! [HIHAT_PEDAL]); vonesa (1); shënimNë (0x90, shënimet e daulles [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); vonesa (1); shënimNë (0x90, shënimet e daulles [HIHAT], 0); }} else {// Shënim i rregullt i daulles MIDI i transmetimitOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); vonesa (1); shënimNë (0x90, shënimet e daulles [drumIn], 0); }}

void noteOn (int cmd, int katran, int shpejtësia) {Serial.write (cmd); Serial.shkruaj (katran); Serial.shkruaj (shpejtësia); }

funksionet e konfigurimit () dhe loop () me lak të funksionimit të pafund të pajisjes:

void setup () {

Serial.filloj (115200);

për (uint8_t i = 0; i <10; i ++) {pinMode (i+2, HYRJE); } #ifdef PRINT_PADS_PIN_NUMBERS ndërsa (e vërtetë) {// lak debug pafund për (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D"); Serial.print (i + '0'); // Shndërroni numrin në karakterin ASCII}}} #else initValues (); / * Mënyra e programimit: Nëse shtypni dy pedale gjatë nisjes - modaliteti aktivizohet */ nëse (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #endif}

lak void () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); nëse (! currentState && previousState ) midiOut (i); // Krahasoni gjendjet dhe zbuloni skajin në rënie Shteti i mëparshëm = gjendja aktuale ; } kick.update (); // Kick daulle përdor algoritmin e personalizuar të debunimit nëse (kick.edge ()) nëse (kick.falling ()) midiOut (KICK); }

Hapi 5: Programimi B: Python & Ndërfaqja e Përdoruesit

Programimi B: Python & Ndërfaqja e Përdoruesit
Programimi B: Python & Ndërfaqja e Përdoruesit
Programimi B: Python & Ndërfaqja e Përdoruesit
Programimi B: Python & Ndërfaqja e Përdoruesit
Programimi B: Python & Ndërfaqja e Përdoruesit
Programimi B: Python & Ndërfaqja e Përdoruesit

Ndërfaqja e përdoruesit Python është pak e komplikuar për tu kuptuar në shikim të parë, kështu që ne do të përpiqemi të shpjegojmë bazat e tij, si të përdorim, çfarë funksioni ka çdo buton dhe si të programojmë siç duhet pajisjen Arduino.

Ndërfaqja e përdoruesit - Aplikimi

UI është një paraqitje grafike për programuesin tonë të kompletit të daulleve, duke e bërë atë vërtet të lehtë për t’u përdorur dhe të përshtatshëm për të programuar pajisjen Arduino në çdo kohë. UI përbëhet nga disa module grafike që lidhen me funksionimin e tyre të sugjeruar. le t'i shqyrtojmë ato një nga një:

  1. Drum Set Image: Python UI përdor koordinatat e imazhit X-Y për të përcaktuar se cili lloj daulle është zgjedhur. Nëse është zgjedhur rajoni i vlefshëm i daulles, shfaqet mesazhi dytësor IO, me fushat e shënimit, shpejtësisë dhe terminalin Arduino për bllokun e dedikuar të daulles. Pasi këto parametra të verifikohen nga përdoruesi dhe të miratohen, këto vlera mund të transmetohen drejtpërdrejt në pajisjen Arduino.
  2. Imazhi i Kontrollorit të Jashtëm: Për të qenë në gjendje të përdorni kompletin e daulleve MIDI me mjedisin krijues VST/Music, ekziston nevoja për të ekzekutuar përkthyesin Serial-To-MIDI. Unë kam përdorur Hairless, i cili është i disponueshëm falas dhe mund të funksionojë direkt nga UI -ja jonë, vetëm duke shtypur imazhin e tij.
  3. Lista e Porteve COM: Për të komunikuar me Arduino, duhet të specifikoni portin e tij të bashkangjitur COM. Lista po rifreskohet duke shtypur butonin Refresh.
  4. Konfigurimi i ngarkimit/ruajtjes: Ekzistojnë vlera të paracaktuara MIDI të përcaktuara në kod, të cilat mund të modifikohen nga përdoruesi duke bashkëvepruar me UI. Konfigurimi përcaktohet në skedarin config.txt në një format të veçantë, i cili mund të ruhet ose ngarkohet nga përdoruesi.
  5. Butoni i Pajisjes së Programit: Për të ruajtur të gjitha vlerat MIDI të modifikuara në Arduino EEPROM, duhet të shtypni dy pedale (Kick drum dhe Hi-hat pedal) pas kësaj, prisni që transmetimi i të dhënave të përfundojë. Nëse do të kishte ndonjë çështje komunikimi, do të shfaqet pop-up i duhur. Nëse transmetimi ka sukses, UI do të tregojë mesazhin e tij të suksesshëm.
  6. Butoni i daljes: Thjesht dilni nga aplikacioni, me lejen e përdoruesit.

Pikat kryesore të kodit Python

Ka shumë gjëra që po ndodhin në kod, kështu që ne do të zgjerojmë funksionet e shkruara dhe jo të gjithë kodin.

Para së gjithash, për të përdorur UI, duhet të shkarkoni disa module, për ta bërë kodin të funksionojë:

import osimport threading import tkinter as tk from tkinter import boxbox from tkinter import * from PIL import ImageTk, Image import numpy as np import serial import glob

Disa nga modulet përfshihen në paketën e parazgjedhur Python. Disa module duhet të instalohen përmes mjetit PIP:

pip instaloni Jastëk

pip instaloni numpy pip instaloni ScreenInfo

Rekomandohet fuqimisht të ekzekutoni aplikacionin përmes PyCharm. Në publikimet e ardhshme, po planifikoj të eksportoj një skedar të ekzekutueshëm për projektin.

Shpjegim i Kodit të Shkurtër

Do të jetë shumë më e lehtë për të kuptuar kodin nëse i shikojmë linjat e tij nga perspektiva e funksioneve dhe klasave:

1. Funksioni kryesor - këtu fillon kodi

nëse _name_ == '_majt_': drumkit_gui ()

2. Konstantet e Drum Kit, koordinatat dhe informacioni i paracaktuar MIDI

Daulle të klasës: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal "," Kontrolluesi "]

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 = ["Kick", "Snare", "Hihat", "Ride", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "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, 110] DRUM_PINS = [8, 6, 4, 3, 11, 9, 5, 10, 2, 7]

3. Funksionet UI - Trajtimi i ndërfaqes së përdoruesit dhe objekteve grafike

def set_active (ui)

def dytësore_ui (lloji i daulles)

klasa SelectionUi (tk. Frame)

aplikimi i klasës (tk. Frame)

def drumkit_gui ()

def event_ui_clicked (ngjarje)

def getorigin (vetja, ngjarja)

4. Komunikimi serik

def get_serial_ports ()

def commun_with_arduino (port)

5. Puna me skedarët: Ruani/Ngarkoni cilësimet nga skedari txt

def save_config ()

def load_config ()

6. Drejtimi i aplikacionit të jashtëm hairless.exe nga kodi duke përdorur aftësitë Python Threading

klasa ExternalExecutableThread (filetimi. Thread)

def run_hairless_executable ()

Për të ekzekutuar kodin, ekziston një listë e skedarëve që duhet të bashkëngjiten në dosjen e projektit:

  • config.txt: Skedari i cilësimeve
  • hairless.exe: Konvertues MIDI pa flokë
  • drumkit.png: Imazh që përcakton të gjitha jastëkët e daulleve të klikueshëm në UI -në tonë (Duhet të shkarkohet nga seti i imazheve të këtij hapi)
  • drumgui.py: Kodi i projektit

Kjo është gjithçka që duhet të theksojmë për ta bërë atë të funksionojë. Veryshtë shumë e rëndësishme të shtoni skedarë në projekt: imazh i vendosur në daulle, i ekzekutueshëm hairless.exe dhe skedari i cilësimeve config.txt.

Dhe.. Këtu kemi bërë!:)

Shpresoj se do ta gjeni të dobishme këtë udhëzues.

Faleminderit per leximin!:)

Recommended: