From 4c07dbe67e01d0f5844d50784880900850585f9d Mon Sep 17 00:00:00 2001 From: Sebastian Lohff Date: Sat, 1 Feb 2025 01:47:11 +0100 Subject: [PATCH] Working CW tool Makes noise and everything --- .gitattributes | 37 ++++++++++++++++++++++++++++ .gitignore | 4 +++ icon.svg | 1 + icon.svg.import | 37 ++++++++++++++++++++++++++++ project.godot | 21 ++++++++++++++++ scenes/main.gd | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ scenes/main.tscn | 43 ++++++++++++++++++++++++++++++++ 7 files changed, 207 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 icon.svg create mode 100644 icon.svg.import create mode 100644 project.godot create mode 100644 scenes/main.gd create mode 100644 scenes/main.tscn diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5d484ab --- /dev/null +++ b/.gitattributes @@ -0,0 +1,37 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf + + +# LFS config +# Audio +*.aif filter=lfs diff=lfs merge=lfs -text +*.aiff filter=lfs diff=lfs merge=lfs -text +*.it filter=lfs diff=lfs merge=lfs -text +*.mod filter=lfs diff=lfs merge=lfs -text +*.mp3 filter=lfs diff=lfs merge=lfs -text +*.ogg filter=lfs diff=lfs merge=lfs -text +*.s3m filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text +*.xm filter=lfs diff=lfs merge=lfs -text +# Fonts +*.otf filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +# Images +*.bmp filter=lfs diff=lfs merge=lfs -text +*.exr filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.hdr filter=lfs diff=lfs merge=lfs -text +*.iff filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.pict filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.psd filter=lfs diff=lfs merge=lfs -text +*.tga filter=lfs diff=lfs merge=lfs -text +*.tif filter=lfs diff=lfs merge=lfs -text +*.tiff filter=lfs diff=lfs merge=lfs -text +*.xcf filter=lfs diff=lfs merge=lfs -text +*.aseprite filter=lfs diff=lfs merge=lfs -text +*.ase filter=lfs diff=lfs merge=lfs -text + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fcae69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Godot 4+ specific ignores +.godot/ +*.swp +*.swo diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..9d8b7fa --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..e3d1b7b --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvaugiwdmfmge" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..e2b43c4 --- /dev/null +++ b/project.godot @@ -0,0 +1,21 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="cw generator" +run/main_scene="res://scenes/main.tscn" +config/features=PackedStringArray("4.3", "Mobile") +run/max_fps=120 +config/icon="res://icon.svg" + +[rendering] + +renderer/rendering_method="mobile" diff --git a/scenes/main.gd b/scenes/main.gd new file mode 100644 index 0000000..d630ebc --- /dev/null +++ b/scenes/main.gd @@ -0,0 +1,64 @@ +extends Control + +var sample_hz = 22050.0 # Keep the number of samples to mix low, GDScript is not super fast. +var pulse_hz = 440.0 +var phase = 0.0 +var morse_state := false +var playback: AudioStreamPlayback = null +var vol_on := -30 + +func _process(_delta): + fill_buffer() + +func fill_buffer(): + var increment = pulse_hz / sample_hz + var frames_available = playback.get_frames_available() + + for i in range(frames_available): + playback.push_frame(Vector2.ONE * sin(phase * TAU)) + phase = fmod(phase + increment, 1.0) + +func _ready(): + $Player.stream.mix_rate = sample_hz + $Player.volume_db = -100 + $Player.play() + playback = $Player.get_stream_playback() + fill_buffer() + + OS.open_midi_inputs() + print(OS.get_connected_midi_inputs()) + +func set_morse_state(state: bool): + morse_state = state + if state: + %ColorRect.color = Color(0, 128, 0) + $Player.volume_db = vol_on + else: + %ColorRect.color = Color(0, 0, 0) + $Player.volume_db = -100 + +func _on_morse_button_down() -> void: + set_morse_state(true) + +func _on_morse_button_up() -> void: + set_morse_state(false) + +func _input(input_event): + if input_event is InputEventMIDI: + _process_midi_event(input_event) + +func _process_midi_event(midi_event): + if midi_event.channel in [0, 9]: + if midi_event.message == MIDI_MESSAGE_NOTE_ON: + set_morse_state(true) + elif midi_event.message == MIDI_MESSAGE_NOTE_OFF: + set_morse_state(false) + #print(midi_event) + #print("Channel ", midi_event.channel) + #print("Message ", midi_event.message) + #print("Pitch ", midi_event.pitch) + #print("Velocity ", midi_event.velocity) + #print("Instrument ", midi_event.instrument) + #print("Pressure ", midi_event.pressure) + #print("Controller number: ", midi_event.controller_number) + #print("Controller value: ", midi_event.controller_value) diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..3ca18bf --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=3 format=3 uid="uid://ctak1goemnnc5"] + +[ext_resource type="Script" path="res://scenes/main.gd" id="1_8bx00"] + +[sub_resource type="AudioStreamGenerator" id="AudioStreamGenerator_kvn5v"] +mix_rate = 11025.0 +buffer_length = 0.2 + +[node name="Node2D" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_8bx00") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(200, 100) +layout_mode = 2 +color = Color(0, 0, 0, 1) + +[node name="MorseButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "MORSE" + +[node name="Player" type="AudioStreamPlayer" parent="."] +stream = SubResource("AudioStreamGenerator_kvn5v") +volume_db = -80.0 + +[connection signal="button_down" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_down"] +[connection signal="button_up" from="VBoxContainer/MorseButton" to="." method="_on_morse_button_up"]