Spisu treści:

Konwerter audio w czasie rzeczywistym na MIDI.: 7 kroków
Konwerter audio w czasie rzeczywistym na MIDI.: 7 kroków

Wideo: Konwerter audio w czasie rzeczywistym na MIDI.: 7 kroków

Wideo: Konwerter audio w czasie rzeczywistym na MIDI.: 7 kroków
Wideo: Jak podłączyć kilka instrumentów przez MIDI do komputera❓ Twórz muzykę na starych syntezatorach 2024, Lipiec
Anonim
Konwerter audio w czasie rzeczywistym na MIDI
Konwerter audio w czasie rzeczywistym na MIDI

Ludzie Namaste! Jest to projekt, nad którym pracowałem w ramach jednego z moich kursów (cyfrowe przetwarzanie sygnałów w czasie rzeczywistym) w ramach mojego programu licencjackiego. Projekt ma na celu stworzenie systemu DSP, który "nasłuchuje" danych audio i wysyła komunikaty MIDI z odpowiednimi nutami przez UART. Do tego celu wykorzystano Arduino Nano. Krótko mówiąc, mikrokontroler wykonuje FFT na przychodzących danych audio i dokonuje analizy szczytów oraz wysyła odpowiedni komunikat MIDI. Nie przejmuj się jednak MOSFETami, ponieważ są one przeznaczone do innego projektu (który zostanie również umieszczony później w instrukcjach) i nie są wymagane w tym projekcie. Więc zacznijmy już !!

Krok 1: Wymagane komponenty

Wymagane komponenty
Wymagane komponenty

Do zbudowania tego projektu potrzebne będą następujące komponenty, chociaż wiele z nich jest ogólnych i można je zastąpić ich odpowiednikami. Zapoznaj się również ze schematem obwodu, aby opracować i znaleźć lepsze implementacje.

Ilość składników

1. Mikrofon elektretowy. 1

2. Rezystor 30 kiloomów. 1

3. Rezystor 150 kiloomów. 1

4. Rezystor 100 omów. 1

5. Rezystory 2,2 kiloomowe. 3

6. Potencjometr 10 kiloomów. 1

7. Potencjometr do przycinania 10 kiloomów. 1

8. Potencjometr stereo 47 kiloomów. 1

9. Rezystory 470 omów. 2

10. Kondensatory 0,01uF. 2

11. Kondensatory 2,2uF. 3

12. Kondensatory 47uF. 2

13. Kondensator 1000uF. 1

14. Kondensator 470uF. 1

15. 7805 regulator napięcia. 1

16. Żeński i męski pasek nagłówka. 1 każdy

17. Złącze Jack Barrel. 1

18. Zasilacz prądu stałego 12 V 1 A. 1

19. Przełącznik SPST. (opcjonalnie) 1

20. Płyta perforowana. 1

Krok 2: Specyfikacje techniczne

Specyfikacja techniczna
Specyfikacja techniczna

Częstotliwość próbkowania: 3840 próbek/s

Liczba próbek na FFT: 256

Rozdzielczość częstotliwości: 15Hz

Częstotliwość odświeżania: około 15 Hz

Niższa i wyższa skala nut nie są prawidłowo uchwycone. Niższe dźwięki cierpią z powodu rozdzielczości niskich częstotliwości, podczas gdy wyższe częstotliwości cierpią z powodu niskich częstotliwości próbkowania. W arduino skończyła się już pamięć, więc nie ma możliwości uzyskania lepszej rozdzielczości. A lepsza rozdzielczość będzie kosztować zmniejszoną częstotliwość odświeżania, więc kompromis jest nieunikniony. Laymanowska wersja zasady nieoznaczoności Heisenberga.

Podstawową trudnością są wykładnicze odstępy między nutami (jak widać na rysunku. Każdy impuls na osi częstotliwości jest nutą muzyczną). Algorytmy takie jak LFT mogą pomóc, ale jest to trochę zaawansowane i mało skomplikowane dla urządzenia takiego jak arduino Nano.

Krok 3: Schematy obwodów

Schematy obwodów
Schematy obwodów
Schematy obwodów
Schematy obwodów
Schematy obwodów
Schematy obwodów
Schematy obwodów
Schematy obwodów

Uwaga: Nie przejmuj się trzema tranzystorami MOSFET i zaciskami śrubowymi na zdjęciach. Nie są wymagane w tym projekcie. Zwróć uwagę, że płytka wejścia mikrofonu jest wymienna lub jak nazywają ją modułową. Poniżej znajduje się krótki opis różnych bloków.

1) Dwa rezystory 470 omów łączą sygnał audio stereo z sygnałem audio mono. Upewnij się, że masa sygnału wejściowego jest zbliżona do wirtualnej masy (vg na schemacie obwodu), a nie do masy obwodu.

2) Następny blok to filtr dolnoprzepustowy drugiego rzędu, który jest odpowiedzialny za ograniczenie pasma sygnału wejściowego w celu uniknięcia aliasingu. Ponieważ pracujemy tylko z zasilaniem +12V, polaryzujemy wzmacniacz operacyjny, tworząc dzielnik napięcia RC. to ogłupia wzmacniacz operacyjny, myśląc, że zasilanie wynosi 6 0-6 woltów (podwójna szyna), gdzie vg jest punktem odniesienia dla wzmacniacza operacyjnego.

3) Następnie wyjście jest filtrowane dolnoprzepustowo, aby zablokować przesunięcie prądu stałego o wartości 6 woltów i połączone z prądem stałym o wartości około 0,55 wolta, ponieważ ADC zostanie skonfigurowany do używania wewnętrznego napięcia 1,1 V jako Vref.

Uwaga: przedwzmacniacz mikrofonu elektretowego nie jest najlepszym obwodem w Internecie. Obwód ze wzmacniaczem operacyjnym byłby lepszym wyborem. Chcemy, aby pasmo przenoszenia było jak najbardziej płaskie. Potencjometr stereo 47 kiloomów służy do definiowania częstotliwości odcięcia, która zwykle powinna wynosić połowę częstotliwości próbkowania. Preset 10 kiloomów (mały potencjometr z białą głowicą) służy do dostrajania wzmocnienia i wartości Q filtra. Potencjometr o wartości 10 kiloomów (jeden z metalową gałką strojenia, która wygląda jak mała śruba z płaskim łbem) służy do ustawienia napięcia tak blisko, jak połowa Vref.

Uwaga: Kiedy podłączasz Nano do PC. pozostaw przełącznik SPST otwarty, w przeciwnym razie zamknięty. Zachowaj szczególną ostrożność, jeśli tego nie zrobisz, może to uszkodzić obwód/komputer/regulator napięcia lub dowolną kombinację powyższych

Krok 4: Niezbędne aplikacje i IDE

Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
Niezbędne aplikacje i IDE
  1. Do kodowania Arduino Nano wybrałem prymitywne studio AVR 5.1, ponieważ wydaje mi się, że działa. Instalator znajdziesz tutaj.
  2. Do programowania Arduino Nano użyłem Xloadera. Jest to naprawdę łatwe w użyciu lekkie narzędzie do nagrywania plików.hex na Arduinos. Możesz to dostać tutaj.
  3. Do małego bonusowego mini projektu i strojenia układu wykorzystałem przetwarzanie. Możesz go pobrać stąd, chociaż dokonaj poważnych zmian w każdej wersji, więc być może będziesz musiał bawić się przestarzałymi funkcjami, aby szkic działał.
  4. FL studio lub inne oprogramowanie do przetwarzania MIDI. Możesz pobrać wersję FL studio z ograniczonym dostępem za darmo stąd.
  5. Loop MIDI tworzy wirtualny port MIDI i jest wykrywany przez FL studio tak, jakby był urządzeniem MIDI. Pobierz kopię tego samego stąd.
  6. Bezwłosy MIDI służy do odczytywania komunikatów MIDI z portu COM i wysyłania ich do zapętlonego portu MIDI. Debuguje również komunikaty MIDI w czasie rzeczywistym, co sprawia, że debugowanie jest wygodne. Pobierz bezwłosy MIDI stąd.

Krok 5: Odpowiednie kody do wszystkiego

Chciałbym podziękować firmie Electronic Lifes MFG (strona internetowa tutaj!!) za bibliotekę punktów stałych FFT, którą wykorzystałem w tym projekcie. Biblioteka jest zoptymalizowana dla rodziny mega AVR. To jest link do plików bibliotecznych i kodów, z których korzystał. Załączam kod poniżej. Zawiera również szkic przetwarzania i kod AVR C. Należy pamiętać, że jest to konfiguracja, która zadziałała dla mnie i nie biorę żadnej odpowiedzialności, jeśli coś uszkodzisz z powodu tych kodów. Poza tym miałem wiele problemów, próbując sprawić, by kod działał. Na przykład DDRD (rejestr kierunku danych) ma DDDx (x = 0-7) jako maski bitowe zamiast konwencjonalnego DDRDx (x = 0-7). Uważaj na te błędy podczas kompilacji. Również zmiana mikrokontrolera wpływa na te definicje, więc miej to na oku podczas rozwiązywania błędów kompilacji. A jeśli zastanawiasz się, dlaczego folder projektu nazywa się DDT_Arduino_328p.rar, powiedzmy tylko, że wieczorem, kiedy zaczynałem, było bardzo ciemno i byłem na tyle leniwy, że nie zapalałem świateł.:P

Przechodząc do szkicu przetwarzania, użyłem przetwarzania 3.3.6 do napisania tego szkicu. Musisz ręcznie ustawić numer portu COM w szkicu. Możesz sprawdzić komentarze w kodzie.

Jeśli ktoś może mi pomóc przenieść kody do Arduino IDE i najnowszej wersji przetwarzania, byłbym zadowolony i udzielę również kredytów deweloperom/współtwórcom.

Krok 6: Konfiguracja

  1. Otwórz kod i skompiluj go z #define pcvisual bez komentarza i #define midi_out z komentarzem.
  2. Otwórz xloader i przejdź do katalogu z kodem, przejdź do pliku.hex i wypal go do nano wybierając odpowiednią płytkę i port COM.
  3. Otwórz szkic przetwarzania i uruchom go z odpowiednim indeksem portu COM. Jeśli wszystko pójdzie dobrze, powinieneś być w stanie zobaczyć widmo sygnału na pinie A0.
  4. Weź śrubokręt i obróć potencjometr trymera, aż widmo będzie płaskie (składowa DC powinna być bliska zeru). Nie wprowadzaj wtedy żadnego sygnału do tablicy. (Nie podłączaj modułu mikrofonu).
  5. Teraz użyj dowolnego takiego narzędzia generatora przemiatania, aby przekazać dane wejściowe do płytki z mikrofonu i obserwować widmo.
  6. Jeśli nie widzisz przemiatania częstotliwości, zmniejsz częstotliwość odcięcia, zmieniając rezystancję 47 kiloomów. Zwiększ również wzmocnienie, używając wstępnie ustawionego potencjometru 10 kiloomów. Postaraj się uzyskać płaski i wyraźny wynik wobulacji, zmieniając te parametry. To fajna część (mały bonus!), graj swoje ulubione piosenki i ciesz się ich spektrum w czasie rzeczywistym. (Obejrzyj wideo)
  7. Teraz ponownie skompiluj osadzony kod C, tym razem z komentarzem #define pcvisual i odkomentowaniem #define midi_out.
  8. Przeładuj nowy skompilowany kod na arduino Nano.
  9. Otwórz LoopMidi i utwórz nowy port.
  10. Otwórz FL studio lub inne oprogramowanie interfejsu MIDI i upewnij się, że port midi pętli jest widoczny w ustawieniach portu MIDI.
  11. Otwórz bezwłosy MIDI z podłączonym arduino. Wybierz port wyjściowy jako port LoopMidi. Przejdź do ustawień i ustaw szybkość transmisji na 115200. Teraz wybierz port COM odpowiadający Arduino Nano i otwórz port.
  12. Zagraj kilka „czystych” tonów w pobliżu mikrofonu i powinieneś również usłyszeć odpowiedni dźwięk w oprogramowaniu MIDI. Jeśli nie ma odpowiedzi, spróbuj obniżyć up_threshold zdefiniowany w kodzie C. Jeśli nuty są uruchamiane losowo, zwiększ wartość up_threshold.
  13. Zdobądź pianino i sprawdź, jak szybki jest twój system! Najlepszą rzeczą jest to, że w strefie banknotów ze złotą kłódką może łatwo wykryć wiele jednoczesnych naciśnięć klawiszy.

Uwaga: Kiedy port COM jest używany przez jedną aplikację, nie może być odczytany przez inną. Na przykład, jeśli bezwłosy MIDI odczytuje port COM, Xloader nie będzie w stanie flashować płyty

Krok 7: Wyniki / filmy

Na razie to wszystko! Mam nadzieję że ci się spodoba. Jeśli masz jakieś sugestie lub ulepszenia w projekcie daj mi znać w sekcji komentarzy. Pokój!

Zalecana: