Create visual effects that plug into the me:DERU Studio. Convert your standalone code into a MOD using EFX LAB.
▶ Open EFX LAB Read the Guide ↓me:DERU consists of two editors: layer-style DERU and node-style NODE. Add various effects through MODs.
Like Atelier's materials, each MOD contains artist-created code. A MOD is a magic box full of possibilities.
Your MOD is a single function. Input goes in, output comes out. No DOM, no state, no side effects.
Define sliders, toggles and selectors. Users adjust them in the Studio — your code receives the values.
MOD programs work in both DERU and NODE editors. Create art and MINT it as your output.
MODs are sold as NFTs. Owning them unlocks additional features as tokengate-protected modules.
Every MOD follows the same Input → Effect → Output pattern. Your function receives pixel data and transforms it.
function yourEffect(data, width, height, params, canvas, ctx) { // data — Uint8ClampedArray: RGBA pixel data // width — number: image width // height — number: image height // params — object: { key: value } from sliders // canvas — HTMLCanvasElement // ctx — CanvasRenderingContext2D for (let i = 0; i < data.length; i += 4) { const r = data[i], g = data[i+1], b = data[i+2]; // ... your effect logic ... data[i] = newR; data[i+1] = newG; data[i+2] = newB; } }
data[] directly for pixel filters, or draw on canvas/ctx for text/drawing effects (then read back into data).EFX LAB is a standalone tool for prototyping MODs. Write code, drop an image, and see the result instantly.
Drag & drop an image onto the Source node, or click to browse. This becomes your INPUT.
Write your effect function in the code editor. Use templates (Grayscale, Pixelate, Kanji) as starting points.
Write params.xxx||default in your code — sliders are generated automatically with correct ranges.
Press Run or Cmd+Enter. The result appears in the MOD and Output nodes. Click to zoom in.
params.contrast||100 and a slider (0–200, default 100) appears instantly.EFX LAB includes an AI assistant powered by Gemini. Describe the effect you want in natural language — the AI generates the processPixels code for you.
Type in any language: 「グリッチエフェクト」, "sepia tone filter", "pixel art style" — the AI understands context.
✦ APPLY TO EDITOR injects the code into the editor. ▶ APPLY & RUN applies and runs immediately.
Continue the conversation: 「もっとコントラスト強く」, 「add noise」 — the AI remembers your previous request.
The AI is constrained to generate only pixel processing code. No eval, fetch, DOM access, or external requests.
| Prompt | Result |
|---|---|
| セピア風のエフェクト | Warm sepia tone filter with adjustable intensity |
| pixel art mosaic | Pixelation effect with block size parameter |
| グリッチ効果をつけて | RGB split + scanline glitch effect |
| watercolor painting | Soft blur + edge detection watercolor simulation |
| ネオン光るエッジ検出 | Edge detection with neon glow effect |
| vaporwave aesthetic | Purple/pink color shift + scan lines + chromatic aberration |
If you have an existing HTML effect, here's how to extract the core algorithm into a MOD function.
Find the pixel processing logic in your code. Ignore all UI, file I/O, download, and state management code. Keep only the math.
Replace document.getElementById('slider').value with params.sliderName||defaultValue. Each slider becomes a param key.
Wrap your algorithm in: function myEffect(data, width, height, params, canvas, ctx) { ... }
Paste your function into the code editor, load an image, and press Run. Adjust params until the effect works correctly.
| Pattern | When | How |
|---|---|---|
| Pixel Filter | Color adjustments, contrast, etc. | Modify data[i] in a loop |
| Spatial/Neighbor | Blur, sharpen, edge detect | Copy data first, read from copy, write to data |
| Canvas Overlay | Text, shapes on top | Put data on canvas, draw, read back |
| Full Canvas Replace | Kanji art, ASCII art | Render to canvas from scratch, read into data |
Once your effect works in EFX LAB, submit it for review and integration into the me:DERU platform.
Your function myEffect(data, width, height, params, canvas, ctx) — the core algorithm.
MOD name, brief description, your artist name, and any notes on parameters or usage.
A screenshot or image showing the effect applied. This helps during review.
| Argument | Type | Description |
|---|---|---|
| data | Uint8ClampedArray | RGBA pixel data — 4 bytes per pixel (R, G, B, A). Modify in-place for output. |
| width | number | Image width in pixels |
| height | number | Image height in pixels |
| params | object | Parameter values from sliders: { contrast: 100, gamma: 1.0, ... } |
| canvas | HTMLCanvasElement | Output canvas — same dimensions as input image |
| ctx | CanvasRenderingContext2D | Canvas 2D context for drawing operations |
| Param Name | Min | Max | Step |
|---|---|---|---|
| contrast | 0 | 200 | 1 |
| brightness | 0 | 200 | 1 |
| gamma | 0.1 | 5 | 0.1 |
| fontSize | 2 | 48 | 1 |
| charWidth | 10 | 200 | 1 |
| pixelSize | 1 | 64 | 1 |
| threshold | 0 | 255 | 1 |
| opacity | 0 | 100 | 1 |
| angle | 0 | 360 | 1 |
| invert | 0 | 1 | 1 |
// Each pixel = 4 consecutive values in the data array // data[i] = Red (0-255) // data[i+1] = Green (0-255) // data[i+2] = Blue (0-255) // data[i+3] = Alpha (0-255) // Get pixel at (x, y): const i = (y * width + x) * 4; const r = data[i], g = data[i+1], b = data[i+2], a = data[i+3]; // Grayscale conversion: const gray = r * 0.3 + g * 0.59 + b * 0.11;
The current MOD architecture processes one frame at a time — which means it's inherently ready for video and GIF processing with no code changes.
Future MODs will receive additional timing information through params, enabling time-based animations:
| Param | Type | Description |
|---|---|---|
| params.frameIndex | number | Current frame number (0, 1, 2, ...) |
| params.totalFrames | number | Total number of frames |
| params.progress | number | Progress ratio (0.0 → 1.0) |
function fadeEffect(data, width, height, params, canvas, ctx) { const t = params.progress || 0; // 0.0 → 1.0 over time for (let i = 0; i < data.length; i += 4) { // Effect that evolves across frames data[i] *= (1 - t * 0.5); // Gradual color shift data[i+1] *= (1 - t * 0.3); data[i+2] *= (1 + t * 0.2); } }
MODs that don't use frame params will apply the same effect to every frame — instant GIF filter.
Use params.progress to create effects that evolve over time — glitch, fade, morph, reveal.