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:
- 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)
- Mod listesinde yeni kaydedilen scripti bulun
- 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 fonksiyonx / width: 0–1 pozisyon oranı oluşturenv.time: Sürekli artan zaman değeri, renklerin akmasını sağlarhsv(): 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ğienv: 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–1env.audio.fft: Spektrum dizisi, düşükten yüksek frekansaenv.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ürhsv(h, s, v): HSV’den RGB’ye, h: 0–360, s/v: 0–255saturate(v): Değeri 0–1 arasında sınırlaclamp(v, min, max): Aralık kırpmamix(a, b, t)/lerp(a, b, t): Doğrusal karıştırmasmoothstep(edge0, edge1, x): Düzgün adımmap(x, inMin, inMax, outMin, outMax): Aralık eşleme
Gürültü ve rastgele:
random(): 0–1 rastgelenoise1(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ı:
- Kare başlangıcında
begin_frame(env)çağır (eğer uygulanmışsa) - Sonra her piksel için
get_color(x, y, width, height, env)çağır - 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.insertgeniş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.