OMNi

📜 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).