📜 Język Skryptowy OmniScript
[!TIP] Elastyczność bez Granic: OmniScript to zintegrowany, szybki język skryptowy stworzony dla producentów muzycznych i projektantów dźwięku. Pozwala na pisanie własnych procesorów MIDI, arpeggiatorów, hybrydowych modulatorów matematycznych oraz prostych efektów DSP bez konieczności kompilowania zewnętrznych wtyczek.
💡 1. Do Czego Służy OmniScript?
Zamiast ograniczać się wyłącznie do gotowych interfejsów graficznych, OmniScript pozwala na wpisanie prostego kodu w edytorze skryptów, który jest kompilowany natychmiastowo na wątku audio:
- Generatory Generatywne: Tworzenie płynnych układów melodi i rytmów na podstawie wybranych skal muzycznych.
- Własne Modulatory: Definiowanie unikalnych równań matematycznych na oscylację dowolnego parametru w mikserze.
- Kreatywne Przekształcanie MIDI: Projektowanie autorskich arpeggiatorów, generatorów akordów i humanizatorów rytmu.
💻 2. Podstawowa Składnia i Przykłady
Składnia OmniScript jest przejrzysta i inspirowana zwięzłymi językami skryptowymi audio:
Przykład A: Algorytmiczny Arpeggiator Generujący Harmonię
// Przykład: Generowanie opóźnionych akordów dla każdej nuty MIDI
fn process_note() {
if velocity > 0 {
// 1. Wyzwól nutę podstawową bez opóźnienia
emit_note(note, velocity, 0);
// 2. Dodaj kwintę (7 półtonów wyżej) po 12000 próbkach (~250ms przy 48kHz)
emit_note(note + 7, velocity * 0.8, 12000);
// 3. Dodaj oktawę (12 półtonów wyżej) po 24000 próbkach (~500ms)
emit_note(note + 12, velocity * 0.6, 24000);
}
}
Przykład B: Generowanie Oscylatora Modulacji Chaotycznej
// Przykład: Własna fala modulacyjna oparta na kombinacji funkcji trig
fn process_mod() {
let phase = beat_pos * 3.14159 * 2.0;
// Płynna oscylacja parametru w zakresie 0.0 – 1.0
let mod_val = (sin(phase) + cos(phase * 0.5)) * 0.5 + 0.5;
return clamp(mod_val, 0.0, 1.0);
}
🛠️ 3. Zmienne Wbudowane i Funkcje API
Wbudowane Zmienne (Brak Konfiguracji):
| Zmienna | Typ | Opis i Zastosowanie |
| :--- | :--- | :--- |
| note | u8 | Wysokość wejściowa przetwarzanej nuty MIDI (zakres 0–127). |
| velocity | u8 | Dynamika wejściowa przetwarzanej nuty MIDI (zakres 0–127). |
| tempo | f64 | Aktualne tempo projektu w BPM (np. 124.0). |
| beat_pos | f64 | Bieżąca pozycja odtwarzania w takcie. |
| sample_rate | f64 | Częstotliwość próbkowania silnika audio (np. 48000.0). |
| spl0 / spl1 | f32 | Próbki sygnału audio dla lewego i prawego kanału. |
Dostępne Funkcje API:
| Funkcja API | Opis i Działanie |
| :--- | :--- |
| emit_note(note, vel, delay) | Planuje wyemitowanie nuty MIDI o wysokości note i dynamice vel po czasie delay (w próbkach). |
| emit_note_off(note, delay) | Wysyła komunikat puszczenia nuty MIDI po zadanym czasie. |
| rand() | Generuje pseudolosową liczbę zmiennoprzecinkową z przedziału [0.0, 1.0]. |
| clamp(val, min, max) | Ogranicza wartość val do podanego przedziału [min, max]. |
| sin(x), cos(x), abs(x) | Standardowe funkcje trygonometryczne i bezwzględne. |
⚡ 4. Płynność w Czasie Rzeczywistym
[!IMPORTANT] Wydajność na Wątku Audio: Kod OmniScript jest kompilowany natychmiast po zmianie w edytorze do bezpiecznego kodu maszyny wirtualnej, gwarantując zero zacięć dźwięku oraz precyzję zegara na poziomie próbek (Sample-Accurate Timing).