TyranoBuilder does not ship with a dialogue blip feature
that works the way most visual novel developers expect.
The engine plays sound effects through the
play_se tag, and that tag plays a file once.
A blip needs to play repeatedly, at the rhythm of the
text reveal, and the engine does not have a built-in
mechanism for “play this sound every time a character
appears.”
The workaround that the community has used for years is a
macro that combines playse with
loop=true, inserted before the dialogue line
and stopped after it. The problem with the macro is that
it does not stop at punctuation, it does not vary between
characters without manual configuration, and it can break
the text speed if the macro introduces a wait. The
popopo plugin solves those problems by
synthesizing the blip internally rather than playing a
file, and the [mtext] tag with
in_delay provides a third path for projects
that want the typewriter effect without a plugin.
This article compares the three approaches, with the specific tag syntax, plugin parameters, and audio format rules that determine whether the blips sound right or break on export. The generic typewriter blip guide covers the design principles; this article is about making them work in TyranoBuilder.
What does the macro-based approach actually do, and why does it need a silent file?
The macro approach uses two macros: one that starts a
looping sound effect, and one that replaces it with a
silent file. The reason for the silent file is that
playse has no “stop” parameter that works
without a target. The only way to stop a looping SE in
TyranoBuilder is to play another SE that replaces it,
and the replacement has to be a file that produces no
audible output.
[macro name="type"]
[playse storage="triangle.ogg" loop=true]
[endmacro]
[macro name="stop"]
[playse storage="silence.ogg" clear=true]
[endmacro]
The clear=true parameter is the part that
stops the previous sound before playing the silence.
Without it, the looping blip continues underneath the
silent file, and the stop macro does nothing. The
silence.ogg file is a requirement, not a
convenience; a project that does not create one will
find that the stop macro either does nothing or produces
an error.
The macro is inserted before the dialogue line, and the stop macro is inserted after the line. The RPG Maker plugin workflow covers a similar pattern for a different engine; the TyranoBuilder version is more manual because the engine does not provide an event that fires per character.
The macro approach has three specific failure modes.
The text speed halves. A macro that
contains a [wait] tag, which is required
if the macro is inserted between every letter, adds the
wait time to the text reveal. A 200-millisecond wait
between letters makes the text reveal twice as slow as
the configured speed, and the player notices immediately.
The blip continues through punctuation. A looping SE does not know when the text pauses. A comma, a period, or an ellipsis does not stop the loop, which means the blip plays during a moment when no text is being revealed. The player hears a continuous tone rather than a voice rhythm.
The blip does not vary between characters. The macro plays one file. A project with multiple speaking characters needs a different macro for each character, and the macros have to be inserted manually in every dialogue line. The visual novel blip guide covers why per-character variation matters; the macro approach makes it tedious to implement.
What does the popopo plugin do differently, and what are its parameters?
The popopo plugin is an external plugin for
TyranoScript that synthesizes the blip internally rather
than playing a file. It was created by Ogihara and is
released under the MIT license. The plugin generates a
short popping sound using a built-in oscillator, which
means it does not need a triangle.ogg or a
silence.ogg, and it does not have the
stop-file problem that the macro approach has.
The plugin is installed by unzipping the
popopo folder into
data/others/plugin/ and adding
[plugin name="popopo"] to
first.ks. Once installed, the
[popopo] tag configures the blip for the
rest of the message. The tag accepts a small set of
parameters that cover the sound design decisions.
| Parameter | Values | Effect |
|---|---|---|
type |
sine / square / sawtooth / triangle / noise / file / none | The waveform, or a file to play |
volume |
0 to 100, or “default” | Loudness of the blip |
time |
milliseconds, default 20 | Length of the generated sound |
tailtime |
milliseconds, default 30 | Fade-out time |
frequency |
A, A+, B, C, D, E, F, G (with + for sharp) | The pitch of the blip |
chara |
character name | Restricts the blip to that character’s lines |
The chara parameter is the feature that makes
the plugin worth using over the macro. It binds the blip
configuration to a character name, which means the
character’s dialogue automatically uses that character’s
blip without any manual insertion. A project with five
speaking characters can have five different blip pitches
by calling [popopo] with a different
frequency and chara value at
the start of each character’s first line.
The time parameter is the one that determines
the blip rate. The default of 20 milliseconds is short
enough that the blips do not overlap even at a fast text
speed, but it is also short enough that the pitch is
barely resolved. A time of 30 to 40
milliseconds produces a blip that is more audible as a
pitch, which is usually the right choice for a character
voice. The blip synthesis guide
covers the relationship between duration and perceived
pitch; the time parameter is the
TyranoBuilder implementation of that relationship.
The tailtime parameter is the fade-out. A
tail time of 30 milliseconds means the blip decays over
30 milliseconds after the time has elapsed,
which produces a smoother sound than a hard cutoff. A
tailtime of 0 produces a click at the end
of every blip, which the player hears as a stutter.
The plugin’s known behavior is that
[popopo type="none"] stops the blip, but it
does not stop a blip that was bound to a character via
chara. The documentation states that the
character-bound blips need a separate
[popopo type="none" chara="name"] to stop.
This is the same class of problem as the macro’s
punctuation issue; the engine does not have a single
“stop all blips” command that covers every binding.
TyranoBuilder V3.00 added a
ポポポ音 component to the message
system, which means the plugin’s functionality is now
partly built into the engine. The component is added by
dragging it onto the timeline, and it uses the same
synthesis parameters as the plugin. A project that is
already on V3.00 may not need the external plugin, but a
project on an earlier version does.
How does the mtext approach compare to the other two?
The [mtext] tag is a TyranoScript tag that
displays text with a typewriter effect and supports an
in_delay parameter. The
in_delay controls the delay between
characters, which means the tag can produce a typewriter
reveal without a separate [delay] tag or a
plugin. A developer who is already using
[mtext] for the reveal can add the blip
logic on top of it by inserting a [playse]
or a [popopo] call at the same point in the
script.
The comparison is not about which tag is better. It is
about which tag the project is already using. A project
that uses the standard message window needs the macro or
the plugin. A project that uses [mtext] for
the reveal has a third option: insert the blip trigger
between the [mtext] lines, using the same
macro pattern that the standard approach uses.
| Approach | Per-character variation | Stop behavior | Plugin required |
|---|---|---|---|
| Macro + loop | Manual, per-macro | Silent file replacement | No |
| popopo plugin | Built-in via chara |
type="none", per character |
Yes |
| mtext + insert | Manual, same as macro | Same as macro | No |
The popopo plugin is the only approach that
has a built-in per-character binding, and it is the only
approach that does not require a silent file. The macro
and mtext approaches are viable for a
project with a single speaking character, but they do not
scale to a cast without manual work per character.
Why do the blips break on export, and how do you prevent it?
The most common export failure is an audio format mismatch. TyranoBuilder’s desktop and browser exports support OGG for sound effects, but the Android and iOS exports require M4A or MP3. An OGG file that plays in the editor and in a Windows build will be silent on Android, because the Android export does not support OGG.
| Target | Supported audio | Unsupported |
|---|---|---|
| Desktop / Browser | OGG (default), MP3 (V2.0+) | — |
| Android | M4A, MP3 | OGG |
| iOS | M4A, MP3 | OGG |
The fix is to prepare two sets of audio files: OGG for the desktop build and M4A or MP3 for the mobile builds. TyranoBuilder does not convert the files automatically, so the developer has to either maintain two asset folders or use a build script that swaps the files before each export.
The second export failure is a filename issue. The
Android export documentation states explicitly that
filenames must not contain Japanese characters. A blip
file named ポポポ.ogg will play in the
editor and fail on Android. The fix is to use ASCII
filenames for every audio asset, even when the rest of
the project is in Japanese.
The third export failure is a missing file. The macro
approach depends on a silence.ogg file that
the developer has to create manually. A project that
copies the macro from a tutorial but does not copy the
silent file will produce an error when the stop macro
runs. The popopo plugin does not have this
problem because it does not need a stop file.
How should the blip itself be designed for TyranoBuilder?
The blip design is the same as for any visual novel: short duration, mid-range frequency, and a waveform that does not fatigue over long sessions. The Web Audio blip tutorial and the visual novel blip guide cover the perceptual ranges; the TyranoBuilder-specific part is the loop behavior.
A looping blip is not the same as a per-character blip.
The loop plays continuously for the duration of the
dialogue line, which means the effective blip rate is
determined by the file’s length, not by the character
rate. A 50-millisecond blip file loops 20 times per
second; a 100-millisecond file loops 10 times per second.
The popopo plugin uses the time
parameter to control the loop length, which means the
developer can tune the rate without changing the text
speed.
The frequency range that works for TyranoBuilder dialogue is the same as for Ren’Py or RPG Maker: 800 to 1400 Hz, with the lower end for serious characters and the higher end for energetic ones. The Ren’Py blip guide covers the per-character frequency separation in more detail; the same logic applies to a TyranoBuilder cast.
The blip generator produces WAV files that can be converted to OGG or MP3 for the TyranoBuilder project. The generated files are free to use, which removes the licensing question that comes with a downloaded blip pack. A project that needs a different blip for each character can generate them from the same tool with different frequency and duration settings, then convert the set to the formats the export targets require.
Dialogue blips in TyranoBuilder are not a built-in
feature, and the three approaches each solve a different
part of the problem. The macro is free but manual. The
popopo plugin is the cleanest option for a
project on an older version, and the V3.00 message
component is the cleanest option for a project that has
updated. The export format rules are the part that most
projects discover too late, and the OGG-versus-M4A
distinction is the one that produces a silent build on
mobile. A project that prepares both formats before the
first export avoids the problem entirely.
Generate a Blip Set for TyranoBuilder
Open the SfxMaker blip generator and create the blip files for each speaking character, using the 800–1400 Hz range and a duration that matches the loop rate you want. Export the files as WAV, convert them to OGG for the desktop build and M4A or MP3 for the mobile builds, and use ASCII filenames for every asset so the Android export does not fail.
Open Blip Sound Generator →