02 Oct, 2025

Skydimo Script Geliştirme Tam Kılavuzu

Skydimo script geliştirme dünyasına hoş geldiniz! Bu kılavuz, ister yeni başlayan ister ileri düzey bir kullanıcı olun, Lua scriptleri kullanarak kendi RGB aydınlatma efektlerinizi nasıl oluşturacağınızı öğrenmenize yardımcı olacaktır. Bu özellik Skydimo beta sürümünde mevcuttur.

İçindekiler


Özellikler Genel Bakış

  • Yaratıcı Özgürlük: Lua koduyla benzersiz aydınlatma efektleri yazın
  • AI Asistanı: Tek bir cümleyle özel efektler oluşturun, AI kodunuzu yazmanıza ve optimize etmenize yardımcı olur
  • Ses Tepkisi: Işıkları müziğe göre dans ettirin, gerçek zamanlı FFT spektrum analizini destekler
  • Çoklu Sekme Yönetimi: Birden fazla scripti aynı anda düzenleyin, kolay geçiş ve organizasyon
  • Anında Yeniden Yükleme: Değişiklikler anında etkili olur, yazılımı yeniden başlatmanıza gerek yok
  • İçe/Dışa Aktarma: Kreasyonlarınızı paylaşın veya topluluk scriptlerini kullanın
  • Tam Kontrol: Hız, parlaklık, renk sıcaklığı ve ton tamamen kontrolünüzde

Hızlı Başlangıç

İlk Scriptiniz: Gökkuşağı Gradyanı

Skydimo → “Scriptler” sayfasında, yeni bir script oluşturun ve şunu girin:

function get_color(x, y, width, height, env)
    -- Konuma ve zamana göre gökkuşağı renkleri oluştur
    local hue = (x / width * 360 + env.time * 60) % 360
    return hsv(hue, 255, 255)
end

Adımlar:

  1. Sağ üstteki “Mod Kaydet” düğmesine tıklayın (soldan sağa düğmeler: Mod Kaydet/Güncelle, Geri Yükle, Kaydı Sil, Dışa Aktar, İçe Aktar)
  2. Mod listesinde yeni kaydedilen scripti bulun
  3. Etkinleştirmek için tıklayın, cihaz akan gökkuşağı gradyan efekti gösterecektir

Kod Açıklaması:

  • get_color: Her piksel için çağrılan fonksiyon
  • x / width: 0–1 pozisyon oranı oluştur
  • env.time: Sürekli artan zaman değeri, renklerin akmasını sağlar
  • hsv(): Ton, doygunluk, parlaklığı RGB rengine dönüştür

Lua Script Temelleri

Lua Nedir?

Lua hafif, öğrenmesi kolay bir programlama dilidir. Skydimo, Lua 5.4 kullanır.

Temel Sözdizimi Hızlı Referans

-- Tek satır yorum

--[[
  Çok satırlı yorum
  Birden fazla satır yazabilirsiniz
]]

-- Değişken tanımı (tür bildirimi gerekmez)
local speed = 100
local name = "Gökkuşağı"
local enabled = true

-- Matematiksel işlemler
local result = (10 + 5) * 2 / 3

-- Koşullu ifadeler
if x > 10 then
    -- Kodu çalıştır
elseif x == 5 then
    -- Başka bir durum
else
    -- Varsayılan durum
end

-- Döngüler
for i = 1, 10 do
    -- 10 kez tekrarla
end

-- Fonksiyon tanımı
local function calculate(a, b)
    return a + b
end

Çekirdek API Özellikleri

Gerekli Fonksiyon: get_color(x, y, width, height, env)

Amaç: Her LED için renk değerini hesapla (her karede birden fazla kez çağrılır)

Parametreler:

  • x, y: Mevcut piksel koordinatları (0’dan başlar)
  • width, height: Cihazın toplam genişliği/yüksekliği
  • env: Ortam değişken nesnesi

Dönüş Değeri: 32-bit tamsayı, format 0x00BBGGRR (Mavi-Yeşil-Kırmızı sırası, her kanal 0–255)

Örnek:

function get_color(x, y, width, height, env)
    return rgb(255, 0, 0)  -- Saf kırmızı
end

İsteğe Bağlı Fonksiyon: begin_frame(env)

Amaç: Her karenin başında bir kez çalıştırılır, ön hesaplama veya kare düzeyinde değişkenleri başlatmak için.

-- Global değişken önceden hesaplanmış sonuçları saklar
local wave_offset = 0

function begin_frame(env)
    -- Kare başına bir kez dalga ofsetini hesapla
    wave_offset = math.sin(env.time) * 50
end

function get_color(x, y, width, height, env)
    -- Önceden hesaplanmış değeri doğrudan kullan
    local hue = (x / width * 360 + wave_offset) % 360
    return hsv(hue, 255, 255)
end

Ortam Değişkenleri

env ortam nesnesindeki yaygın alanlar:

  • env.time: Başlangıçtan bu yana geçen toplam süre (saniye, float)
  • env.dt: Önceki kareden mevcut kareye zaman adımı (saniye)
  • env.fps: Mevcut kare hızı (kare/saniye)
  • env.random: 0–1 rastgele sayı tohumu (her karede değişir)
  • env.bpm: Dakikadaki Vuruş, ritim odaklı efektler için (isteğe bağlı)
  • env.audio: Ses verisi nesnesi (isteğe bağlı)
    • env.audio.level: Genel ses zarf 0–1
    • env.audio.fft: Spektrum dizisi, düşükten yüksek frekansa
    • env.audio.sampleRate: Ses örnekleme hızı
    • env.audio.enabled: Ses girişinin etkin olup olmadığı

Yerleşik Fonksiyon Kütüphanesi

Renk yapımı ve dönüşümü:

  • rgb(r, g, b): 32-bit renk döndür
  • hsv(h, s, v): HSV’den RGB’ye, h: 0–360, s/v: 0–255
  • saturate(v): Değeri 0–1 arasında sınırla
  • clamp(v, min, max): Aralık kırpma
  • mix(a, b, t) / lerp(a, b, t): Doğrusal karıştırma
  • smoothstep(edge0, edge1, x): Düzgün adım
  • map(x, inMin, inMax, outMin, outMax): Aralık eşleme

Gürültü ve rastgele:

  • random(): 0–1 rastgele
  • noise1(x) / noise2(x, y): Düzgün gürültü

Ses Görselleştirme

Örnek spektrum görselleştirme:

local spectrum = {}

function begin_frame(env)
    if env.audio and env.audio.fft then
        spectrum = env.audio.fft
    end
end

function get_color(x, y, width, height, env)
    if not spectrum or #spectrum == 0 then
        return rgb(10, 10, 10)
    end
    local band = math.max(1, math.floor((x / width) * #spectrum))
    local amp = spectrum[band] or 0
    local h = (band / #spectrum) * 360
    local v = math.floor(math.min(255, amp * 255 * 1.5))
    return hsv(h, 255, v)
end

Çalışma Zamanı Mekanizması

Render döngüsü sırası:

  1. Kare başlangıcında begin_frame(env) çağır (eğer uygulanmışsa)
  2. Sonra her piksel için get_color(x, y, width, height, env) çağır
  3. Kare renk tamponunu cihaza gönder

Performans ipuçları:

  • Karmaşık hesaplamaları begin_frame’de yapın ve sonuçları önbelleğe alın
  • Birçok geçici tablo oluşturmaktan kaçının
  • Mümkün olduğunda önceden hesaplanmış arama tablolarını kullanın

AI Destekli Geliştirme

Script editöründe istediğiniz efekti tanımlayın (örneğin, “düşük frekans sıcak renk çubuklarını sürükler, vuruş nabzı parlaklığı artırır”), ve AI başlangıç kodunu oluşturacaktır. Hızlı bir şekilde yinelemek için değişiklik önerileri sunmaya devam edin.


Pratik Örnekler

1) Spektrum Çubuk Grafiği (Yatay)

local smoothed = {}

function begin_frame(env)
    if not (env.audio and env.audio.fft) then return end
    local fft = env.audio.fft
    for i = 1, #fft do
        local v = fft[i]
        smoothed[i] = smoothed[i] and (smoothed[i] * 0.6 + v * 0.4) or v
    end
end

function get_color(x, y, width, height, env)
    if not smoothed or #smoothed == 0 then return rgb(0,0,0) end
    local band = math.max(1, math.floor((x / width) * #smoothed))
    local level = smoothed[band] or 0
    local barH = math.floor(level * height)
    if (height - 1 - y) <= barH then
        local hue = (band / #smoothed) * 360
        return hsv(hue, 255, 255)
    else
        return rgb(0, 0, 0)
    end
end

En İyi Uygulamalar

  • Ağır hesaplamaları begin_frame’de ve veri ön işlemede önceliklendirin
  • Sık erişilen global nesneleri yerel değişkenlerle önbelleğe alın
  • Geçici tabloları dikkatle oluşturun, döngülerde table.insert genişleme ek yükünden kaçının
  • Parametreleri ve dönüş değerlerini sınır kontrolleriyle koruyun
  • Renk ve parlaklık aralıklarını tutarlı tutun (0–255), aşarsa kırpın

Sık Sorulan Sorular

S1: get_color’ın dönüş formatı nedir?
C: 32-bit tamsayı döndürür, format 0x00BBGGRR.

S2: Ses görselleştirme neden yanıt vermiyor?
C: env.audio.enabled ve giriş cihazını kontrol edin; ayrıca çalışma zamanı ortamının mikrofon iznini verip vermediğini onaylayın.

S3: Kare hızı nasıl iyileştirilir?
C: get_color’daki karmaşık hesaplamaları azaltın; yeniden kullanılabilir değerleri begin_frame’e koyun; geçici tablolar oluşturmaktan kaçının.

S4: Birden fazla scripti aynı anda çalıştırmayı destekliyor mu?
C: Ana bilgisayar uygulamasına bağlıdır; hata ayıklama ve performans güvencesi için cihaz başına bir scripti etkinleştirmenizi öneririz.


Sorularınız veya önerileriniz mi var? Hızlı geri bildirim için buraya tıklayın.

Teknik Destek | Bize Ulaşın