268 lines
7.3 KiB
GDScript
268 lines
7.3 KiB
GDScript
extends StaticBody
|
|
|
|
export (float, 0, 700) var audible_range_max = 700.0
|
|
export (int, 1, 12) var preset = 1
|
|
|
|
export (bool) var use_embeded_patch = true
|
|
export (String, MULTILINE) var patch = """#N canvas 499 23 442 521 12;
|
|
#X obj 21 22 r fromGodot\\$0;
|
|
#X obj 21 46 list trim;
|
|
#X obj 303 253 hsl 100 20 -1 1 0 0 empty empty empty -2 -10 0 12 #fcfcfc #000000 #000000 0 1;
|
|
#X obj 300 349 line~;
|
|
#X msg 300 325 \\$1 100;
|
|
#X obj 300 278 expr ($f1 + 1)/8;
|
|
#X floatatom 300 302 5 0 0 0 - - - 0;
|
|
#N canvas 68 97 450 300 pan2~ 0;
|
|
#X obj 51 98 cos~;
|
|
#X obj 111 98 cos~;
|
|
#X obj 33 128 *~;
|
|
#X obj 93 128 *~;
|
|
#X obj 33 158 outlet~;
|
|
#X obj 93 158 outlet~;
|
|
#X obj 33 24 inlet~;
|
|
#X obj 111 24 inlet~;
|
|
#X obj 111 74 +~ 0.75;
|
|
#X connect 0 0 2 1;
|
|
#X connect 1 0 3 1;
|
|
#X connect 2 0 4 0;
|
|
#X connect 3 0 5 0;
|
|
#X connect 6 0 2 0;
|
|
#X connect 6 0 3 0;
|
|
#X connect 7 0 8 0;
|
|
#X connect 7 0 0 0;
|
|
#X connect 8 0 1 0;
|
|
#X restore 199 437 pd pan2~;
|
|
#X obj 195 409 *~;
|
|
#X obj 189 127 unpack f f;
|
|
#X floatatom 296 159 5 0 0 0 - - - 0;
|
|
#X obj 296 182 sin;
|
|
#X floatatom 296 206 5 0 0 0 - - - 0;
|
|
#N canvas 9 27 426 474 synth 0;
|
|
#X obj 85 326 *~;
|
|
#X obj 25 256 osc~;
|
|
#X obj 147 249 vline~;
|
|
#X obj 39 117 tgl 19 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000 0 1;
|
|
#X obj 39 144 metro 4000;
|
|
#X obj 85 356 outlet~;
|
|
#X obj 39 87 r guide;
|
|
#X obj 146 17 inlet;
|
|
#X obj 178 71 v \\$0-preset;
|
|
#X obj 146 44 t b a;
|
|
#N canvas 47 74 450 300 preset-metro 0;
|
|
#X obj 57 55 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
|
|
#X obj 57 79 v \\$0-preset;
|
|
#X obj 57 103 sel 1 2 3;
|
|
#X msg 57 133 4000;
|
|
#X obj 57 15 inlet;
|
|
#X obj 57 253 outlet;
|
|
#X msg 77 163 3200;
|
|
#X msg 97 193 2200;
|
|
#X connect 0 0 1 0;
|
|
#X connect 1 0 2 0;
|
|
#X connect 2 0 3 0;
|
|
#X connect 2 1 6 0;
|
|
#X connect 2 2 7 0;
|
|
#X connect 3 0 5 0;
|
|
#X connect 4 0 0 0;
|
|
#X connect 6 0 5 0;
|
|
#X connect 7 0 5 0;
|
|
#X restore 146 104 pd preset-metro;
|
|
#N canvas 47 74 450 300 preset-osc 0;
|
|
#X obj 57 55 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
|
|
#X obj 57 79 v \\$0-preset;
|
|
#X obj 57 103 sel 1 2 3;
|
|
#X obj 57 15 inlet;
|
|
#X obj 57 253 outlet;
|
|
#X msg 57 133 420;
|
|
#X msg 77 163 445;
|
|
#X msg 97 193 372;
|
|
#X connect 0 0 1 0;
|
|
#X connect 1 0 2 0;
|
|
#X connect 2 0 5 0;
|
|
#X connect 2 1 6 0;
|
|
#X connect 2 2 7 0;
|
|
#X connect 3 0 0 0;
|
|
#X connect 5 0 4 0;
|
|
#X connect 6 0 4 0;
|
|
#X connect 7 0 4 0;
|
|
#X restore 25 226 pd preset-osc;
|
|
#N canvas 47 74 450 300 preset-vline 0;
|
|
#X obj 57 55 bng 19 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000;
|
|
#X obj 57 79 v \\$0-preset;
|
|
#X obj 57 103 sel 1 2 3;
|
|
#X obj 57 15 inlet;
|
|
#X obj 57 253 outlet;
|
|
#X msg 57 143 0.3 60 0 \\, 0.2 100 100 \\, 0 1500 200;
|
|
#X msg 77 173 0.3 40 0 \\, 0.2 80 40 \\, 0 800 200;
|
|
#X msg 97 203 0.3 20 0 \\, 0.22 100 20 \\, 0 500 200;
|
|
#X connect 0 0 1 0;
|
|
#X connect 1 0 2 0;
|
|
#X connect 2 0 5 0;
|
|
#X connect 2 1 6 0;
|
|
#X connect 2 2 7 0;
|
|
#X connect 3 0 0 0;
|
|
#X connect 5 0 4 0;
|
|
#X connect 6 0 4 0;
|
|
#X connect 7 0 4 0;
|
|
#X restore 147 219 pd preset-vline;
|
|
#X connect 0 0 5 0;
|
|
#X connect 1 0 0 0;
|
|
#X connect 2 0 0 1;
|
|
#X connect 3 0 4 0;
|
|
#X connect 4 0 12 0;
|
|
#X connect 4 0 11 0;
|
|
#X connect 6 0 3 0;
|
|
#X connect 7 0 9 0;
|
|
#X connect 9 0 10 0;
|
|
#X connect 9 1 8 0;
|
|
#X connect 10 0 4 1;
|
|
#X connect 11 0 1 0;
|
|
#X connect 12 0 2 0;
|
|
#X restore 21 280 pd synth;
|
|
#X floatatom 346 110 5 0 0 0 - - - 0;
|
|
#X obj 346 133 s guide;
|
|
#X obj 189 276 line~;
|
|
#X msg 189 252 \\$1 100;
|
|
#X floatatom 189 189 5 0 0 0 - - - 0;
|
|
#X obj 132 322 switch~;
|
|
#X obj 132 298 tgl 19 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000 0 1;
|
|
#X obj 132 274 change;
|
|
#X text 89 167 switch on/off before 0 to stop startup pops, f 12;
|
|
#X obj 189 228 max 0;
|
|
#X obj 132 250 > -0.3;
|
|
#X obj 21 70 route freq panvol param preset guide;
|
|
#X floatatom 23 193 5 0 0 0 - - - 0;
|
|
#X obj 199 467 dac~ 1 2;
|
|
#X obj 108 375 *~ 0.2;
|
|
#X connect 0 0 1 0;
|
|
#X connect 1 0 25 0;
|
|
#X connect 2 0 5 0;
|
|
#X connect 3 0 7 1;
|
|
#X connect 4 0 3 0;
|
|
#X connect 5 0 6 0;
|
|
#X connect 6 0 4 0;
|
|
#X connect 7 0 27 0;
|
|
#X connect 7 1 27 1;
|
|
#X connect 8 0 7 0;
|
|
#X connect 9 0 18 0;
|
|
#X connect 9 1 10 0;
|
|
#X connect 10 0 11 0;
|
|
#X connect 11 0 12 0;
|
|
#X connect 12 0 2 0;
|
|
#X connect 13 0 28 0;
|
|
#X connect 14 0 15 0;
|
|
#X connect 16 0 8 1;
|
|
#X connect 17 0 16 0;
|
|
#X connect 18 0 23 0;
|
|
#X connect 18 0 24 0;
|
|
#X connect 20 0 19 0;
|
|
#X connect 21 0 20 0;
|
|
#X connect 23 0 17 0;
|
|
#X connect 24 0 21 0;
|
|
#X connect 25 1 9 0;
|
|
#X connect 25 3 13 0;
|
|
#X connect 25 4 14 0;
|
|
#X connect 26 0 13 0;
|
|
#X connect 28 0 8 0;
|
|
"""
|
|
|
|
var _my_patch = "user://guide/guide.pd"
|
|
var _my_id = 0
|
|
|
|
var _guide = false
|
|
|
|
func set_param(param):
|
|
Global._gdpd.start_message(param.size()+1)
|
|
Global._gdpd.add_symbol("param")
|
|
for i in range(param.size()):
|
|
Global._gdpd.add_float(param[i])
|
|
Global._gdpd.finish_list("fromGodot" + String(_my_id))
|
|
|
|
func set_preset(prs):
|
|
preset = prs
|
|
Global._gdpd.start_message(2)
|
|
Global._gdpd.add_symbol("preset")
|
|
Global._gdpd.add_float(prs)
|
|
Global._gdpd.finish_list("fromGodot" + String(_my_id))
|
|
|
|
func set_guide(g):
|
|
Global._gdpd.start_message(2)
|
|
Global._gdpd.add_symbol("guide")
|
|
Global._gdpd.add_float(g)
|
|
Global._gdpd.finish_list("fromGodot" + String(_my_id))
|
|
|
|
func set_color(color):
|
|
$MeshInstance.material_override = SpatialMaterial.new()
|
|
$MeshInstance.material_override.albedo_color = color
|
|
|
|
func relocate(center, radius_range):
|
|
# relocate randomly into a circular zone
|
|
var rr = radius_range[1] - radius_range[0]
|
|
var displacement = polar2cartesian(randf()*rr+radius_range[0], randf()*2*PI)
|
|
var loc = center + displacement
|
|
look_at_from_position(Vector3(loc.x, randf()*2 + 1, loc.y), Vector3.FORWARD, Vector3.UP)
|
|
|
|
func _ready():
|
|
# save patch (for export)
|
|
if use_embeded_patch:
|
|
assert(_my_patch.substr(0, 7) == "user://", "use userpath with embeded_patch enabled !")
|
|
assert(patch != "", "patch is empty?")
|
|
_save_patch()
|
|
|
|
# load patch
|
|
_my_id = Global.load_patch(ProjectSettings.globalize_path(_my_patch))
|
|
|
|
# listen 'player_transform_updated' event
|
|
Events.connect("player_transform_updated", self, "_on_Events_player_transform_updated")
|
|
|
|
# send 'preset'
|
|
set_preset(preset)
|
|
|
|
func _on_Events_player_transform_updated(playerpos, playerheading):
|
|
var mypos = get_global_translation()
|
|
var mypos2d = Vector2(mypos.x, mypos.z)
|
|
var playerpos2d = Vector2(playerpos.x, playerpos.z)
|
|
# calculate distance
|
|
var distance = mypos.distance_to(playerpos)
|
|
# calculate angle
|
|
var angle = fmod(fmod(playerpos2d.angle_to_point(mypos2d) + playerheading - PI/2, PI*2) + PI*2, PI*2)
|
|
if angle > PI:
|
|
angle = angle - PI*2
|
|
# (check)
|
|
# print(str(_my_id) +" : ("+ str(distance) +","+ str(angle) +")")
|
|
# calculate gain
|
|
var gain = 1 - distance/audible_range_max
|
|
# send to the patch
|
|
Global._gdpd.start_message(3)
|
|
Global._gdpd.add_symbol("panvol")
|
|
Global._gdpd.add_float(gain)
|
|
Global._gdpd.add_float(angle)
|
|
Global._gdpd.finish_list("fromGodot" + String(_my_id))
|
|
|
|
func _physics_process(delta):
|
|
if Input.is_action_just_pressed("guide"):
|
|
_guide = not _guide
|
|
set_guide(int(_guide))
|
|
if _guide:
|
|
Out.set_gain(0.2)
|
|
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), -6)
|
|
else:
|
|
Out.set_gain(1)
|
|
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), 0)
|
|
|
|
func _exit_tree():
|
|
Global.close_patch(_my_id)
|
|
|
|
func _save_patch():
|
|
# save patch
|
|
# prepare directory
|
|
var patch_name = _my_patch.split("/")[-1]
|
|
var patch_dir = _my_patch.trim_suffix(patch_name)
|
|
var dir = Directory.new()
|
|
dir.make_dir_recursive(patch_dir)
|
|
# save to file
|
|
var file = File.new()
|
|
file.open(_my_patch, File.WRITE)
|
|
file.store_string(patch)
|
|
file.close()
|