Saya membangun sequencer musik ini .
Hanya saja itu bukan sequencer, itu adalah antarmuka fisik untuk sequencer. Sequencer adalah aplikasi yang berjalan pada laptop yang terhubung dengan sequencer, hal ini memungkinkan pengguna membuat drum loop dengan cepat. Ini cukup menyenangkan, tetapi membutuhkan laptop karena sequencer tidak 'on-board'.
Yang ingin saya lakukan adalah melakukan sequencing di perangkat saya.
Sekarang mari kita asumsikan saya tahu bagaimana menyelesaikan kepatuhan kelas untuk konektivitas USB MIDI, dan mari kita juga berasumsi saya bisa mencari cara untuk memasang arduino untuk mengirim catatan MIDI dari port DIN 5 pin. Yang paling saya pedulikan adalah tempo melayang dari waktu ke waktu karena waktu yang tidak konsisten dalam jumlah menit setiap kali putaran acara.
Beberapa hal yang saya tahu:
Anda seharusnya tidak mengandalkan
delay()
untuk mengontrol lingkaran tempo. Delay menghentikan semua operasi firmware, dan itu tidak dapat berfungsi karena saya perlu melakukan polling pada antarmuka pengguna fisik untuk perubahan ketika urutan sedang berjalan.Perhitungan berdasarkan
millis()
lebih baik karena firmware dapat terus beroperasi dan bertindak ketika jumlah tertentu telah berlalu.Meskipun tidak ada kontrol fisik saya yang memicu rutinitas interupsi, beberapa operasi dapat menunda operasi utama
loop()
. Jika saya mendesain fungsi yang menunggu input pengguna, itu jelas dapat menyebabkan masalah kehilangan "tenggat waktu" untuk bertindak jikamillis()
hitungannya sudah berakhir. Saya tahu masalah ini adalah desain saya sendiri ...
Pertanyaan:
A. Apakah Arduino berbasis AVR mikrokontroler yang tepat untuk polling antarmuka pengguna dan menjalankan loop waktu misi kritis? Saya tahu ada Arduino berbasis ARM sekarang jauh lebih cepat. Akankah Teensy 3.0 menjadi alternatif yang lebih baik? Kedua ini adalah papan 3.3V, jadi itu satu set masalah untuk dikerjakan ... tapi saya akan mengabaikannya untuk saat ini.
B. Haruskah saya membagi tugas menjadi dua mikroprosesor? Satu untuk menangani polling dan memperbarui antarmuka pengguna dan satu untuk loop timing misi kritis.
c. Sesuatu yang lain
Tujuan utama saya adalah tidak harus menggunakan komputer sama sekali. Saya juga ingin menghitung untuk ayunan, tetapi dalam kasus ini, ayunan tidak berarti apa-apa jika saya tidak mendapatkan tempo yang akurat dan tepat waktu. Terima kasih atas saranmu!
noInterrupts();
menghentikan jitter, tetapi juga menghentikan semua interupsi yang diinginkan.