GrandMA3 Plugin ile MAnet Üzerinden Veri Alışverişi

GrandMA3 plugin sistemi ve MAnet protokolü kullanarak konsollar arası gerçek zamanlı veri alışverişini Lua ile nasıl yapacağınızı öğrenin.

MAnet ve Plugin Sistemi: Temel Kavramlar

GrandMA3, kendi geliştirdiği MAnet protokolü üzerinden konsollar, NPU'lar ve diğer MA3 cihazları arasında kesintisiz veri senkronizasyonu sağlar. Plugin sistemi ise bu altyapıyı Lua betikleri aracılığıyla doğrudan kullanmanıza olanak tanır. Yani bir plugin yazarak hem yerel show datasına erişebilir hem de ağdaki diğer cihazlarla veri paylaşabilirsiniz.

MAnet Üzerinden Veri Alışverişinin Çalışma Mantığı

GrandMA3 plugin ortamında MAnet verilerine erişmek için konsolun sunduğu built-in Lua API fonksiyonlarını kullanırsınız. Doğrudan soket programlaması yapmanıza gerek yoktur; MA3 bu katmanı soyutlar. Veriler Session yapısı üzerinden paylaşılır ve tüm sessiondaki cihazlar aynı data pool'u görür.

Temel Yaklaşım: DataPool Okuma ve Yazma

Plugin içinden show datasına erişmenin en yaygın yolu GetVar() ve SetVar() fonksiyonlarıdır. Bu fonksiyonlar session genelinde paylaşılan değişkenleri okuyup yazmanızı sağlar.

  • GetVar(name) – Belirtilen değişkeni session'dan okur
  • SetVar(name, value) – Değişkeni session genelinde tüm cihazlara yazar
  • GetFocusStation() – Aktif istasyonun bilgilerini döndürür
  • GetSessionName() – Mevcut session adını verir

Basit Bir Veri Alışverişi Örneği

Aşağıdaki örnekte bir plugin, sahne numarasını session'a yazar ve başka bir plugin bu değeri okuyarak ilgili cuelist'i tetikler:

Yazma tarafı (Yayıncı Plugin):

local sahneNo = 5 SetVar("AktifSahne", sahneNo) Printf("Sahne %d session'a yazıldı", sahneNo)

Okuma tarafı (Abone Plugin):

local deger = GetVar("AktifSahne") if deger ~= nil then Printf("Okunan sahne numarası: " .. tostring(deger)) end
Önemli Not: SetVar ile yazılan veriler tüm MAnet session katılımcılarına anlık olarak yayılır. Bu nedenle değişken adlandırmasında çakışmayı önlemek için proje adı ön eki kullanın; örneğin "PROJE_AktifSahne".

Loop ile Sürekli Veri Dinleme

Bir plugin'in MAnet üzerinden gelen değişiklikleri sürekli izlemesi gerekiyorsa coroutine yapısıyla döngü kurabilirsiniz:

local function Ana() while true do local deger = GetVar("PROJE_Tetik") if deger == 1 then -- İşlemi gerçekleştir SetVar("PROJE_Tetik", 0) end coroutine.yield() end end return Ana

Bu yapıda plugin her frame'de çalışır, değeri kontrol eder ve gerektiğinde tepki verir. coroutine.yield() çağrısı konsolun diğer işlemlerini bloke etmeden arka planda çalışmasını sağlar.

Dikkat Edilmesi Gereken Noktalar

  1. MAnet session'ında Master/Slave rollerine dikkat edin; bazı yazma işlemleri yalnızca Master cihazda geçerlidir.
  2. Plugin döngüleri çok sık çalışırsa konsol performansını etkileyebilir; coroutine.yield() ile frame hızını sınırlayın.
  3. Paylaşılan değişken adları büyük/küçük harf duyarlıdır; tutarsız kullanım sessiz hatalara yol açar.
  4. Show kaydedildiğinde SetVar değerleri persist olmaz; kalıcı veri için UserVar veya plugin konfigürasyon dosyası kullanın.

Gelişmiş Kullanım: Fixture Datasını Okuma

Yalnızca değişken alışverişiyle sınırlı değilsiniz. DataPool() fonksiyonu ile aktif show'daki fixture, sequence ve preset verilerine de ulaşabilirsiniz. Bu sayede bir konsolda yapılan patch değişikliğini algılayıp ağdaki başka bir süreci otomatik başlatmak mümkündür.

local pool = DataPool() local fixtureCount = pool.Fixtures.Count Printf("Toplam fixture sayısı: " .. tostring(fixtureCount))

Bu yaklaşım özellikle çok konsollu sistemlerde merkezi bir orkestrasyon katmanı oluşturmak isteyenlere güçlü bir esneklik sunar.