AudioKit dan sintesis audio di iOS / OSX



AudioKit adalah kerangka kerja audio yang dikembangkan oleh insinyur audio, programer dan musisi khusus untuk iOS dan OSX. Ini menyediakan alat untuk memproses dan mensintesis suara. Di bawah kap adalah campuran dari Swift, Objective-C, C ++ dan C, dan API Unit Audio Apple. Teknologi luar biasa (dan agak canggih) dibungkus dengan API Swift yang sangat ramah, yang dapat diakses langsung dari Xcode Playgrounds!

Dalam tutorial ini, kita akan melakukan perjalanan melalui AudioKit, serta sejarah sintesis suara. Anda akan mempelajari dasar-dasar fisika bunyi dan bagaimana synthesizer pertama seperti Hammond Organ bekerja. Juga, teknik-teknik modern, misalnya, pengambilan sampel, akan dipertimbangkan.

Buat minuman favorit Anda, duduk dan pergi!

Langkah pertama


Dimulai dengan AudioKit 3.6, mengatur taman bermain untuk bekerja dengan kerangka kerja menjadi sangat sederhana. Unduh dan unzip daftar putar starter di sini .

Perjalanan dimulai dengan beberapa langkah untuk mengkonfigurasi taman bermain untuk bekerja dengan AudioKit.

Buka file AudioKitPlaygrounds.xcodeproj di Xcode. Klik tombol + di sudut kiri bawah layar, pilih File ... lalu Blank di bagian Playground , simpan file baru di folder Playgrounds bersama dengan taman bermain demo.

Taman bermain yang baru ditambahkan akan mulai dan akan terlihat seperti ini:


Ganti kode yang dihasilkan dengan yang berikut ini:

import AudioKitPlaygrounds import AudioKit let oscillator = AKOscillator()  AudioKit.output = oscillator try AudioKit.start() oscillator.start() sleep(10) 

Taman bermain tidak akan dimulai sampai Anda setidaknya sekali merakit proyek, untuk ini Anda dapat menggunakan item menu Product / Build atau kombinasi tombol ⌘-B . Setelah itu, jalankan lagi taman bermain dan dengarkan suara berdengung selama 10 detik. (Catatan penerjemah: kadang-kadang kesalahan tidak hilang, dan Anda perlu beralih ke taman bermain lain dan kembali untuk membuatnya berfungsi). Anda dapat menggunakan tombol Mainkan / Hentikan di kiri bawah jendela putar untuk menghentikan pemutaran atau memulai kembali.
Catatan: Jika Anda masih melihat kesalahan, coba mulai ulang Xcode. Sayangnya, kerangka kerja dan taman bermain bukanlah teman yang sangat baik satu sama lain dan dapat berperilaku tak terduga.

Osilator dan fisika bunyi


Umat ​​manusia telah memainkan musik melalui berbagai objek fisik selama ribuan tahun. Banyak instrumen kami yang biasa, seperti gitar atau drum, berusia ratusan tahun. Pengalaman rekaman pertama menggunakan sirkuit elektronik untuk menghasilkan suara dilakukan pada tahun 1874 oleh Elias Gray. Elisha bekerja di bidang telekomunikasi, dan ia menemukan osilator - synthesizer musik paling sederhana. Dengan dia kita akan mulai menyelam.

Klik kanan pada taman bermain Anda, pilih New Playground Page dan ganti kode yang dihasilkan dengan yang berikut:

 import AudioKitPlaygrounds import AudioKit import PlaygroundSupport // 1. Create an oscillator let oscillator = AKOscillator() // 2. Start the AudioKit 'engine' AudioKit.output = oscillator try AudioKit.start() // 3. Start the oscillator oscillator.start() PlaygroundPage.current.needsIndefiniteExecution = true 

Taman bermain akan mulai menghasilkan buzz berkelanjutan - sebagaimana dimaksud. Anda dapat mengklik berhenti untuk menghentikannya.

Ini hampir sama dengan apa yang kami lakukan di taman bermain sebelumnya, tapi kali ini kami akan menyelami detailnya.

Pertimbangkan semua langkah dalam urutan:

  1. Di sini kita membuat osilator. Osilator adalah penerus AKNode . Node adalah elemen yang membentuk rantai audio yang menghasilkan dan memodifikasi suara.
  2. Di sini kita menghubungkan output dari simpul terakhir kami dengan mesin AudioKit. Dalam kasus kami, hanya satu simpul. Selanjutnya, kerangka kerja akan mengarahkan output dari node ke perangkat pemutaran audio.
  3. Nah, kita mulai osilator, pada output itu mulai mengirimkan gelombang suara.

Osilator menghasilkan sinyal berulang yang tidak berhenti. Dalam buku pedoman ini, AKOscillator menghasilkan gelombang sinus. Menggunakan AudioKit, sinyal gelombang sinus digital dikirim ke speaker atau headphone. Hasilnya, kami mendengar suara yang berosilasi pada frekuensi yang sama dengan gelombang sinus yang kami hasilkan. Gelombang sinus ini tidak terdengar terlalu musikal.



Dua parameter bertanggung jawab untuk suara osilator ini: amplitudo - ketinggian gelombang sinus, menentukan volume dan frekuensi suara - ketinggian suara tergantung padanya.

Di taman bermain, tambahkan baris kode berikut tepat setelah membuat osilator:

 oscillator.frequency = 300 oscillator.amplitude = 0.5 

Suara telah berubah, sekarang terdengar dua kali lebih tenang dan jauh lebih rendah. Frekuensi sinyal diukur dalam hertz (jumlah pengulangan per detik) dan menentukan nada not. Amplitudo (amplitudo) diatur dari 0 ke 1 dan bertanggung jawab untuk volume.

Penemuan Elijah Gray dicatat dalam paten pertama untuk alat musik elektronik.



Bertahun-tahun kemudian, Leo Theremin menemukan alat musik yang agak aneh yang digunakan sampai hari ini - theremin. Di theremin, Anda dapat mengubah frekuensi suara dengan gerakan tangan di atas instrumen. Untuk memahami bagaimana suara Theremin, Anda dapat mendengarkan Getaran Beach Boys, suara Theremin tidak perlu dikacaukan.

Anda dapat mensimulasikan suara thereminvox, untuk ini, tambahkan kode berikut ke pengaturan osilator:

 oscillator.rampDuration = 0.2 

Dan ganti baris mulai AudioKit ( try AudioKit.start() ) dengan yang berikut:

 let performance = AKPeriodicFunction(every: 0.5) { oscillator.frequency = oscillator.frequency == 500 ? 100 : 500 } try AudioKit.start(withPeriodicFunctions: performance) performance.start() 

Properti rampDuration memungkinkan osilator untuk dengan lancar mengubah nilai parameternya (misalnya, frekuensi atau amplitudo). AKPeriodicFunction adalah utilitas yang berguna dari AudioKit untuk eksekusi kode periodik. Dalam contoh kami, ini mengubah frekuensi gelombang sinus dari 500Hz ke 100Hz setiap 0,5 detik.

Selamat! Anda baru saja membuat theremin pertama Anda. Osilator sederhana dapat menghasilkan not musik, tetapi tidak terdengar bagus. Ada banyak faktor yang mempengaruhi suara instrumen fisik, seperti piano, misalnya. Dan selanjutnya kita akan mempertimbangkan beberapa dari mereka.

Amplop Suara


Ketika alat musik memainkan nada, volume suaranya berubah seiring waktu, dan sifat perubahannya berbeda dari satu instrumen ke instrumen lainnya. Model yang dapat mensimulasikan efek ini disebut amplop Attack-Decay-Sustain-Release (ADSR) (Catatan: synthesizer yang tersedia untuk pembelian tidak pernah dilokalkan, sehingga nama kurva sama dengan yang dapat dilihat pada panel synthesizer ini).



Amplop ADSR terdiri dari:

  • Serangan : serangan atau waktu di mana suara mencapai volume maksimum.
  • Decay : liar atau waktu volume turun dari maksimum ke utama
  • Sustain : volume utama, tidak seperti dua parameter sebelumnya, bukan waktu, setelah serangan dan buas berlalu dan sebelum Anda melepaskan kunci synthesizer, suara akan dihasilkan dengan volume ini
  • Rilis : rilis atau waktu di mana volume menjadi nol

Dalam piano, suara diekstraksi oleh palu mengetuk senar, dan karenanya di dalamnya cepat atau, mereka juga mengatakan, serangan pendek dan liar. Biola dapat memiliki serangan panjang, liar dan berkelanjutan, musisi dapat mempengaruhi parameter ini dengan cara dia menggunakan busur.

Salah satu alat musik elektronik pertama adalah Hammond Novachord. Instrumen ini diproduksi pada tahun 1939, terdiri dari 163 tabung vakum dan lebih dari 1000 kapasitor, dan beratnya 230 kilogram. Sayangnya, hanya beberapa ratus salinan dibuat, dan ia tidak pernah menerima kesuksesan komersial.



Klik kanan pada Journey Playground , pilih New Playground Page dan buat halaman baru yang disebut ADSR . Ganti kode yang dihasilkan dengan yang berikut ini:

 import AudioKitPlaygrounds import AudioKit import PlaygroundSupport          let oscillator = AKOscillator() 

Itu hanya menciptakan osilator yang sudah kita kenal. Selanjutnya, tambahkan kode berikut di akhir taman bermain:

 let envelope = AKAmplitudeEnvelope(oscillator) envelope.attackDuration = 0.01 envelope.decayDuration = 0.1 envelope.sustainLevel = 0.1 envelope.releaseDuration = 0.3 

Ini menciptakan AKAmplitudeEnvelope yang mendefinisikan amplop ADSR. Parameter durasi (attackDuration, decayDuration, releaseDuration) ditentukan dalam detik, dan volume (SustainLevel) diatur dalam kisaran dari 0 hingga 1.

AKAmplitudeEnvelope adalah penerus AKNode dengan cara yang sama seperti AKOscillator . Dalam kode di atas, kita meneruskan node amplop osilator ke penginisialisasi, sehingga menghubungkan node.

Selanjutnya, tambahkan kode berikut:

 AudioKit.output = envelope let performance = AKPeriodicFunction(every: 0.5) { if (envelope.isStarted) { envelope.stop() } else { envelope.start() } } try AudioKit.start(withPeriodicFunctions: performance) performance.start() oscillator.start() PlaygroundPage.current.needsIndefiniteExecution = true 

Ini akan meluncurkan AudioKit, tapi kali ini kami mengumpankan output dari node ADSR ke inputnya. Untuk mendengar efek ADSR, kami terus-menerus menghidupkan dan mematikan simpul menggunakan AKPeriodicFunction .



Sekarang Anda dapat mendengar bagaimana not dimainkan dalam siklus, tetapi kali ini lebih seperti piano.

Loop berjalan dua kali per detik pada setiap iterasi, memulai atau menghentikan ADSR. Ketika ADSR dimulai dengan serangan cepat, volume mencapai nilai maksimumnya dalam 0,01 detik, setelah itu volume menurun ke tingkat utama dalam 0,1 detik dan tetap di sana selama 0,5 detik, dan pada akhirnya meluruh dalam 0,3 detik.

Anda dapat bermain dengan parameter sendiri dan mencoba untuk bermain, misalnya, suara biola.

Suara yang kami temui didasarkan pada gelombang sinus yang dihasilkan AKOscillator . Meskipun ASDR membantu memuluskan suara-suara keras, Anda tetap tidak bisa menyebut suara-suara ini musikal.

Selanjutnya kami akan mempertimbangkan cara mendapatkan suara yang lebih dalam.

Sintesis aditif


Setiap alat musik memiliki suara atau timbre khusus. Timbre adalah yang membedakan piano dari biola, meskipun mereka dapat memainkan nada yang sama. Parameter penting dari timbre adalah spektrum suara. Spektrum suara menggambarkan kisaran frekuensi yang direproduksi yang, jika ditambahkan bersama, memberikan catatan. Taman bermain kami saat ini menggunakan osilator yang terdengar hanya pada satu frekuensi, dan itu terdengar sangat artifisial.

Anda bisa mendapatkan suara yang lebih hidup menggunakan satu set osilator untuk memainkan satu not. Pendekatan ini dikenal sebagai sintesis aditif, dan ini adalah topik taman bermain kami berikutnya.

Klik kanan pada taman bermain, pilih New Playground Page dan buat halaman baru yang disebut Sintesis Aditif . Ganti kode yang dihasilkan dengan yang berikut ini:

 import AudioKitPlaygrounds import AudioKit import AudioKitUI import PlaygroundSupport func createAndStartOscillator(frequency: Double) -> AKOscillator { let oscillator = AKOscillator() oscillator.frequency = frequency return oscillator } 

Untuk sintesis aditif, Anda memerlukan beberapa osilator, untuk ini kami akan gunakan. createAndStartOscillator

Selanjutnya, tambahkan kode:

 let frequencies = (1...5).map { $0 * 261.63 } 

Di sini kita mengambil interval angka dari 1 hingga 5 dan kalikan masing-masing dengan 261,53, frekuensi catatan. Frekuensi ganda yang dihasilkan disebut harmonik.

Sekarang tambahkan kode:

 let oscillators = frequencies.map { createAndStartOscillator(frequency: $0) } 

Di sini kami membuat osilator untuk setiap frekuensi yang kami gunakan.

Untuk menggabungkan osilator tambahkan kode berikut:

 let mixer = AKMixer() oscillators.forEach { $0.connect(to: mixer) } 

AKMixer adalah jenis lain dari simpul AudioKit. Ia menerima input dari satu atau lebih node dan menggabungkannya menjadi satu.

Tambahkan kode berikut:

 let envelope = AKAmplitudeEnvelope(mixer) envelope.attackDuration = 0.01 envelope.decayDuration = 0.1 envelope.sustainLevel = 0.1 envelope.releaseDuration = 0.3 AudioKit.output = envelope let performance = AKPeriodicFunction(every: 0.5) { if (envelope.isStarted) { envelope.stop() } else { envelope.start() } } try AudioKit.start(withPeriodicFunctions: performance) performance.start() oscillators.forEach { $0.start() } 

Semuanya harus jelas dengan kode ini: tambahkan ADSR ke output mixer, output melalui AudioKit dan secara berkala menyalakan / mematikannya.

Agar dapat menangani sintesis aditif dengan baik, akan berguna untuk bermain dengan berbagai kombinasi frekuensi ini. Dan dalam hal ini, peluang taman bermain seperti Live View sangat ideal bagi kami.

Untuk melakukan ini, tambahkan kode:

 class LiveView: AKLiveViewController { override func viewDidLoad() { addTitle("Harmonics") oscillators.forEach { oscillator in let harmonicSlider = AKSlider( property: "\(oscillator.frequency) Hz", value: oscillator.amplitude ) { amplitude in oscillator.amplitude = amplitude } addView(harmonicSlider) } } } PlaygroundPage.current.needsIndefiniteExecution = true PlaygroundPage.current.liveView = LiveView() 

Di AudioKit ada kelas khusus untuk pekerjaan yang nyaman di taman bermain. Dalam contoh AKLiveViewController , AKLiveViewController menggunakan AKLiveViewController , dengan menggunakannya kita menempatkan elemen secara vertikal. Dan juga untuk setiap osilator kami membuat AKSlider . Slider diinisialisasi oleh nilai frekuensi dan amplitudo osilator, dan menyebabkan blok ketika berinteraksi dengan mereka. Di blok setiap slider, kami mengubah amplitudo osilator yang sesuai. Jadi Anda bisa menambahkan interaktivitas ke taman bermain Anda.

Untuk melihat hasil taman bermain, Anda harus memiliki Live View yang ditampilkan di layar. Untuk melakukan ini, pilih tombol dengan lingkaran berpotongan di bagian kanan atas jendela dan pastikan bahwa daftar putar yang benar dipilih untuk Live View.



Untuk mengubah nada instrumen Anda, Anda dapat mengubah nilai masing-masing slider secara individual. Untuk suara realistis, saya sarankan Anda mencoba konfigurasi yang ditunjukkan pada gambar di atas.

Salah satu synthesizer pertama yang menggunakan sintesis aditif adalah Teleharmonium dan beratnya 200 ton! Berat dan ukurannya yang luar biasa, kemungkinan besar, menjadi alasan ketidakjelasannya. Organ Hammond yang lebih sukses menggunakan roda nada yang serupa, tetapi jauh lebih kecil. Diciptakan pada tahun 1935, masih banyak dikenal sebagai instrumen populer di era rock progresif.



Roda nada adalah disk berputar dengan rongga kecil di sepanjang tepi dan pickup yang terletak di dekat tepi. Organ Hammond memiliki satu set roda nada yang dapat berputar dengan kecepatan yang berbeda. Cara yang agak tidak biasa untuk menghasilkan suara lebih elektromekanis daripada elektronik.

Untuk menghasilkan spektrum suara yang lebih realistis, ada beberapa teknik lagi: modulasi frekuensi (Frequency Modulation atau FM) dan modulasi lebar pulsa (Pulse Width Modulation atau PWM), kedua teknik tersebut tersedia dalam AudioKit di kelas AKFMOscillator dan AKPWMOscillator . Saya sarankan Anda mencoba keduanya, ganti mereka bukan AKOscillator , yang kami gunakan sebelumnya.

Polifoni


Pada tahun 1970-an, perpindahan dimulai dari synthesizer modular, yang terdiri dari osilator dan filter amplop terpisah, hingga yang mikroprosesor. Alih-alih menggunakan sirkuit analog, suara mulai dihasilkan dalam format digital. Ini membuat synthesizer lebih murah dan lebih kompak, dan synthesizer dari merek seperti Yamaha sangat populer.



Semua taman bermain kami terbatas untuk memainkan satu not pada satu waktu. Banyak instrumen yang mampu memainkan lebih dari satu not pada satu waktu, mereka disebut polifonik . Instrumen yang dapat memainkan hanya satu not disebut monofonik .

Untuk mendapatkan suara polifonik, Anda dapat membuat beberapa osilator dan mengirimkannya ke mixer, tetapi di AudioKit ada cara yang lebih cocok untuk ini.

Buat halaman baru di taman bermain dan beri nama Polifoni. Ganti kode yang dihasilkan dengan yang berikut ini:

 import AudioKitPlaygrounds import AudioKit import AudioKitUI import PlaygroundSupport let bank = AKOscillatorBank() AudioKit.output = bank try AudioKit.start() 

Di sini kami menciptakan bank osilator AKOscillatorBank . Jika Anda pergi ke deklarasi kelas, Anda dapat menemukan bahwa itu adalah pewaris AKPolyphonicNode , yang, pada gilirannya, adalah pewaris AKNode sudah diketahui oleh kami, dan juga mengimplementasikan protokol AKPolyphonic .

Akibatnya, bank osilator adalah simpul AudioKit yang sama seperti yang kami ulas sebelumnya. Keluarannya dapat dikirim ke mixer, amplop, atau filter dan efek lainnya. Protokol AKPolyphonic menjelaskan cara memainkan not pada not polifonik, mari kita pertimbangkan lebih detail.

Untuk menguji osilator kami, kami membutuhkan cara untuk memainkan beberapa catatan sekaligus. Ini sama sekali tidak sulit!

Tambahkan kode berikut ke daftar putar dan pastikan Live View terbuka:

 class LiveView: AKLiveViewController, AKKeyboardDelegate { override func viewDidLoad() { let keyboard = AKKeyboardView(width: 440, height: 100) addView(keyboard) } } PlaygroundPage.current.liveView = LiveView() PlaygroundPage.current.needsIndefiniteExecution = true 

Saat taman bermain dikompilasi, Anda akan melihat yang berikut:



Keren ya Keyboard musik tepat di taman bermain!

AKKeyboardView adalah utilitas lain dari AudioKit yang membuatnya mudah untuk mengeksplorasi kemungkinan kerangka kerja. Tekan tombol dan Anda akan menemukan bahwa mereka tidak mengeluarkan suara.

Perbarui setUp PlaygroundView Anda dengan yang berikut ini:

 let keyboard = AKKeyboardView(width: 440, height: 100) keyboard.delegate = self addView(keyboard) 

Ini akan menjadikan PlaygroundView kami sebagai delegasi keyboard dan memungkinkan Anda untuk menanggapi penekanan tombol.

Perbarui deklarasi kelas sebagai berikut:

 class LiveView: AKLiveViewController, AKKeyboardDelegate 


Tambahkan juga beberapa metode setelah setUp :

 func noteOn(note: MIDINoteNumber) { bank.play(noteNumber: note, velocity: 80) } func noteOff(note: MIDINoteNumber) { bank.stop(noteNumber: note) } 

Setiap kali Anda menekan tombol, metode noteOn , yang dilakukannya hanyalah memberi tahu oscillator untuk mulai memainkan note tersebut, masing-masing, dalam metode noteOff , noteOff tersebut berhenti dimainkan.

Pegang mouse dan geser tombolnya, Anda akan mendengar crescendo yang indah (istilah musikal untuk peningkatan kekuatan suara secara bertahap). Bank osilator sudah mengandung efek ADSR bawaan, sebagai hasil dari pelemahan satu not yang dicampur dengan serangan berikutnya dan terdengar cukup bagus.

Anda mungkin telah memperhatikan bahwa catatan yang memberi kami kunci tidak datang dalam bentuk frekuensi. Mereka dinyatakan sebagai MIDINoteNumber . Jika Anda membuka iklan jenis ini, Anda akan melihat yang berikut:

 public typealias MIDINoteNumber = Int 

MIDI adalah singkatan dari Musical Instrument Digital Interface. Ini adalah format luas untuk interaksi alat musik satu sama lain. Catatan nomor sesuai dengan catatan pada keyboard musik standar. Parameter kedua - Velocity (velocity) ini sesuai dengan gaya tumbukan pada kunci. Semakin rendah nilainya, semakin lembut sentuhan pada tombol, semakin tenang bunyi akhir.

Pada akhirnya, Anda perlu mengaktifkan mode polifonik pada tombol. Tambahkan kode berikut ke metode setUp :

 keyboard.polyphonicMode = true 

Sekarang Anda dapat memainkan beberapa catatan sekaligus, seperti yang ditunjukkan pada gambar:



Ngomong-ngomong, ini ada di C mayor :)

AudioKit memulai ceritanya sejak lama. Hari ini ia menggunakan Soundpipe dan kode dari Csound (proyek MIT yang diluncurkan pada 1985). Anehnya, kode yang sekarang kita luncurkan di taman bermain dan ditambahkan ke iPhone ditulis hampir 30 tahun yang lalu.

Sampling


Teknik-teknik sintesis suara yang kami eksplorasi sebelumnya sedang mencoba untuk menciptakan kembali suara realistis menggunakan blok-blok dasar sederhana: osilator, filter, dan mixer. Pada awal tahun 1970-an, pengembangan kapasitas komputer menyebabkan munculnya pendekatan baru - pengambilan sampel suara, yang tujuannya adalah untuk membuat salinan suara digital.

Sampling adalah teknologi yang cukup sederhana mirip dengan fotografi digital. Selama pengambilan sampel secara berkala, amplitudo gelombang suara direkam:



Dua parameter memengaruhi seberapa akurat suara direkam:

  • Kedalaman bit : atau kedalaman bit, jumlah level volume individual yang dapat dimainkan sampler
  • Sample rate : atau sample rate, menunjukkan seberapa sering pengukuran amplitudo diambil. Diukur dalam hertz.

Mari jelajahi properti ini di taman bermain baru. Buat halaman baru dan beri nama "Sampel". Ganti kode yang dihasilkan dengan yang berikut ini:

 import AudioKitPlaygrounds import AudioKit import PlaygroundSupport let file = try AKAudioFile(readFileName: "climax-disco-part2.wav", baseDir: .resources) let player = try AKAudioPlayer(file: file) player.looping = true 

Kode di atas memuat sampel, membuat pemutar audio dan menempatkannya pada pemutaran tanpa akhir.

Arsip dengan file WAV untuk tutorial ini tersedia di sini . Unduh dan unzip ke folder Resources di taman bermain Anda.

Kemudian tambahkan kode berikut di akhir taman bermain:

 AudioKit.output = player try AudioKit.start() player.play() PlaygroundPage.current.needsIndefiniteExecution = true 

Ini akan menghubungkan pemutar audio Anda dengan AudioKit, Anda hanya perlu menaikkan volume dan menikmati!

, .

MP3-, , , . :

 let bitcrusher = AKBitCrusher(player) bitcrusher.bitDepth = 16 bitcrusher.sampleRate = 40000 

AudioKit:

 AudioKit.output = bitcrusher 

. , .

AKBitCrusher β€” AudioKit, . , , ZX Spectrum BBC Micro. , .

, (. delay). , AKBitCrusher . :

 let delay = AKDelay(player) delay.time = 0.1 delay.dryWetMix = 1 

0.1 . dryWetMix . 1 , .

:

 let leftPan = AKPanner(player, pan: -1) let rightPan = AKPanner(delay, pan: 1) 

AKPanner , - . .

AudioKit. , AKBitCrusher AudioKit :

 let mix = AKMixer(leftPan, rightPan) AudioKit.output = mix 

, , .



Apa selanjutnya


AudioKit. , -, , , . , , .

.

Source: https://habr.com/ru/post/id440226/


All Articles