u/Bizkaidroid

Designing my gameh from anywhere. I built custom tools to handle full level design on my mobile phone using Godot.
▲ 2 r/GameDevelopment+1 crossposts

Designing my gameh from anywhere. I built custom tools to handle full level design on my mobile phone using Godot.

Hi everyone! 🚀

I wanted to share a quick look at my mobile workflow. Instead of being tied to a desk, I built an ecosystem of custom tools within Godot that allow me to design, draw, and orchestrate complex levels directly from my phone.

In the next video, you'll see a "speed-run" of how I build a level from scratch in just a few minutes using these tools. https://youtu.be/l4NpJhhxJHo

It's been a game-changer for productivity on the go. If you’re curious about the technical side or how these tools work, I’ve written a full breakdown in my devlog:

🔗 https://bizkaidroid.itch.io/retro-burn/devlog/1514738/devlog-3-on-the-go-level-design-building-retro-burn-from-my-phone

Happy to answer any questions about the setup or developing a full project on Android!

u/Bizkaidroid — 13 days ago
▲ 35 r/godot

Real-time Procedural Music in Godot 4: From GDScript to C++ GDExtension

Hi 🚀

A few weeks ago, I shared a prototype of a "Synthetic Composer" in r/gamedev (https://www.reddit.com/r/gamedev/comments/1c6dswp/i\_wrote\_a\_synthetic\_composer\_in\_python\_to\_generate/). The feedback was incredibly helpful and it pushed me to move from pre-rendered Python scripts to a fully integrated real-time procedural engine in Godot 4.

The GDScript Wall

I initially tried porting the logic to pure GDScript using the AudioStreamGenerator node. It worked for simple tests, but as soon as I added multiple instruments (Piano, Brass, Strings, Percussion) at 44.1kHz, the performance on mobile devices plummeted. Filling audio buffers every frame is a heavy task for an interpreted language when you want complex ADSR envelopes and real-time transitions.

The GDExtension Solution

To solve this, I migrated the synthesis engine to a C++ GDExtension. This gave me the performance overhead needed to handle:

Direct Buffer Access: Low-latency PCM manipulation.

Data-Driven Design: All melodies and behaviors are defined in a JSON file, allowing for quick tweaks without recompiling.

Mobile Portability: Compiling for both arm64 and arm32 (for those tricky low-RAM devices).


 { "acts": [{ 

"base_notes": [0, 3, 4, 0], 

"channels": {

"piano": { ... }, 

"brass": { ... } } 

}]

 } 

See the evolution in action:

🎬 New Real-time Engine (C++): https://youtu.be/8tfO12jHzcM

🎬 Old Offline Version (Python): https://youtu.be/nb\_vfBaLpIs 

For a full technical breakdown of the architecture, the build process, and the JSON explanation, check out my latest devlog here: https://bizkaidroid.itch.io/retro-burn/devlog/1511378/devlog-2-optimizing-with-c-and-melody-management-via-json

I'd love to hear your thoughts on pushing Godot's audio capabilities.

u/Bizkaidroid — 18 days ago
▲ 1 r/GameDevelopment+1 crossposts

Hi 🚀

If you followed my previous thread, you know I started this journey with simple Python scripts to generate static audio files. The feedback from this community was both brutal and brilliant, pushing me to move from pre-rendered tracks to a real-time procedural engine built in C++.

Here is a simplified look at the new JSON logic:


json

{

  "name": "Act 1.1: The Awakening",

  "base_notes": [0, 3, 4, 0],

  "channels": {

"piano": {

"pattern": [[0, 0.0], [4, 0.0], {...}],

"rhythms": [[16.1, 12.1, 12.1], {...}]

},

"brass": { ...},

"strings": { ... },

"percussion": { ... }

  },

  "events": {

"FUEL_LOW": { "overrides": { "piano": { "vol": 0.8 }, "strings": { "speed": 0.75 } } }

  }

}

How your feedback shaped this engine:

- Harmonic Foundation: To solve the "random computer sounds" issue, I added base_notes (the scale degrees) and pattern. Now, instruments play notes relative to a chord structure instead of just random frequencies.

- Rhythmic Variety: The rhythms are now groups of sequences. The engine picks one at random each time a cycle ends, and using decimal values (like 16.1) allows me to trigger things like the sustain pedal for a more natural sound.

- Dynamic Events: You suggested music should react to the game. Now, the events system allows the game state to override any parameter (volume, speed, notes) in real-time.

- Acts & Progression: To prevent ear fatigue, I implemented Acts. Act 1.1 transits into Act 1.2, keeping the same theme but evolving the complexity.

- The Power of C++: Moving to a GDExtension gave me the performance to run multiple oscillators and complex ADSR envelopes at 44.1kHz without dropping frames.

Check out the progress:

🎬 New Showcase (C++ Real-time Engine): https://youtu.be/8tfO12jHzcM

🎬 Old Version (Python Scripts): https://youtu.be/nb\_vfBaLpIs

For a deep dive into the C++ architecture and every JSON parameter, check out the full explanation in my blog here: https://bizkaidroid.itch.io/retro-burn/devlog/1511378/devlog-2-optimizing-with-c-and-melody-management-via-json

Thanks again for pushing me to build something better than just "random sounds"!

u/Bizkaidroid — 18 days ago