Share your projects


dialogic.png


I got the Dialogic plugin to work in my project today. Godot 3's class_name bugs upset me greatly.
 
@TeDaDeS mentioned MIDI so here's my MIDI sequencer. It auto-detects all your devices. Can sequence unlimited tracks of unlimited length. Has infinite undo! Copy paste functionalty. Can record realtime or step mode. Can sequence control codes (sythesizer parameters) so you can get funky. Calculates the stdev of MIDI clock jitter. 37 keyboard shortcuts... It's just a single python script that snowballed. But it's no longer maintainable, having no unit tests. So it's feature complete! It's totally usable.

1692433676088.png
 

Attachments

  • seq.txt
    18.2 KB · Views: 137
@TeDaDeS mentioned MIDI so here's my MIDI sequencer. It auto-detects all your devices. Can sequence unlimited tracks of unlimited length. Has infinite undo! Copy paste functionalty. Can record realtime or step mode. Can sequence control codes (sythesizer parameters) so you can get funky. Calculates the stdev of MIDI clock jitter. 37 keyboard shortcuts... It's just a single python script that snowballed. But it's no longer maintainable, having no unit tests. So it's feature complete! It's totally usable.
I found a paper version of a report I wrote during the project and it had some images (in color, they must have had a fancy printer I could use for free I guess).

render.png
A render of how the device would look.

GUI.png
A really tiny picture of the GUI used in my firmware. It shows 5 boxes with a 0 inside (those would change value based on the knobs rotation).
The bottom middle I think was a bar graph. You could configure these 'views' to use the appropriate type for the usage of a certain input (knob, key on a keyboard, MIDI signal, etc).
 
  • Like
Reactions: rSl
I found a paper version of a report I wrote during the project and it had some images (in color, they must have had a fancy printer I could use for free I guess).

View attachment 38793
A render of how the device would look.

View attachment 38794
A really tiny picture of the GUI used in my firmware. It shows 5 boxes with a 0 inside (those would change value based on the knobs rotation).
The bottom middle I think was a bar graph. You could configure these 'views' to use the appropriate type for the usage of a certain input (knob, key on a keyboard, MIDI signal, etc).
Cool!

I just ordered one of these from second party builder in Sweden. It's open source firmware and iiuc the communication is all midi.

 
I stumbled across autopep8 yesterday. I've let it loose on a couple of my projects and its certainly made the code more readable. I'm hoping that my use of it will make it easier for people to contribute to or modify my projects.

Edit: One thing that I've noticed about it is that it is absolutely dead set on there being nothing within two blank lines of a function, including comments. There's probably something in pep8 explaining this behaviour.
 
Last edited:
I've uploaded a new version of audex to my website. I've simplified the code and run it through autopep8. I've also re-tested it with the latest (28.08.23) version of this FFmpeg fork (it works fine).

On the image editing program (imgedit) front, its in the testing/polishing phase. After that I just need to update the readme file and it should be done.
 
I've uploaded a copy of the new and improved imgedit to my website.

Future plans (in no particular order):
  • Finish my zoo trip game
  • Freshen up my video downloading program
  • Make a todo list program*
  • Make more games
* I found a couple of pre-existing GUI todo list programs written in Python but they required QT. My thought at the time was "I'm not installing the entirety of QT just so that I can run a basic todo list program". So I'm going to have a go at making my own using Tkinter (Python's built in GUI module).
 
My latest project was fitting a cubic spline loop through points and then determining the closest distance from a given point to that loop and the angle of the spline at that point, I know the late 80s called but for me it was quite a project, did manage though.
 
Future plans (in no particular order):
  • Finish my zoo trip game
  • Freshen up my video downloading program
  • Make a todo list program
  • Make more games

I have done none of these things, what I've done instead is create a configuration (ini) file creator. It lets you create new and update existing ini files, it supports both the = and : seperators. I just have to finish off the readme file then its done.

Source code for the folks that hate following instructions:

Python:
import tkinter as tk
from tkinter import filedialog as tkfd
from tkinter import scrolledtext as tkst


def file_types():
    file_exts = (('ini file', '*.ini'),
                 ('all files', '*.*'))
    return file_exts


def load_file():
    opts_load = tkfd.askopenfilename(
        title='Load Options File', filetypes=file_types())
    try:
        with open(opts_load, 'r', encoding='utf-8') as opts_file_inp:
            opts_data = opts_file_inp.read().rstrip('\n').splitlines(True)
    except FileNotFoundError:
        return

    for item in opts_data:
        if item.startswith('[') and item.endswith(']\n'):
            opts_item = item.replace('[', '', 1).replace(']', '', -1)
        # .find returns the index number of a substring, -1 = not found
        elif item.find(' = ') < item.find(' : ') and item.find(' = ') >= 0:
            sep_char.set(' = ')
            opts_item = item.replace(sep_char.get(), '  ', 1)
        elif item.find(' : ') < item.find(' = ') and item.find(' : ') == -1:
            sep_char.set(' = ')
            opts_item = item.replace(sep_char.get(), '  ', 1)
        else:
            sep_char.set(' : ')
            opts_item = item.replace(sep_char.get(), '  ', 1)

        opts_tbox.insert('end', opts_item)


def save_file():
    opts_list: list = []
    opts_data = opts_tbox.get('1.0', 'end').rstrip('\n').splitlines(True)

    for item in opts_data:
        if '  ' in item:
            opts_item = item.replace('  ', sep_char.get(), 1)
        elif item != '\n':
            if item.endswith('\n'):
                # Add a square bracket to start + end of list item
                opts_item = f'[{item[:-1]}]{item[-1:]}'
            else:
                opts_item = f'[{item}]'
        else:
            opts_item = item
        opts_list.append(opts_item)

    opts_save = tkfd.asksaveasfilename(
        title='Save Options File', filetypes=file_types(), defaultextension='.ini')
    try:
        with open(opts_save, 'w', encoding='utf-8') as opts_file_out:
            opts_file_out.writelines(opts_list)
    except FileNotFoundError:
        return


# Create main window
root = tk.Tk()

win_width = 1000
win_height = 500

# Position window on screen
horiz_pos = int(root.winfo_screenwidth()/2 - win_width/2)
vert_pos = int(root.winfo_screenheight()/2.5 - win_height/2)
root.geometry(f'{win_width}x{win_height}+{horiz_pos}+{vert_pos}')

root.title('Configuration File Creator')

sep_char = tk.StringVar()
sep_char.set(' = ')
menu_bar = tk.Menu(root)
menu_bar.config(font=('Arial', 11))
file_menu = tk.Menu(menu_bar, font=('Arial', 11), tearoff=0)
file_menu.add_command(label='Load File', command=load_file)
file_menu.add_command(label='Save File', command=save_file)
file_menu.add_command(label='Exit', command=root.destroy)
menu_bar.add_cascade(label='File', menu=file_menu)
seperator_menu = tk.Menu(menu_bar, font=('Arial', 11), tearoff=0)
seperator_menu.add_radiobutton(
    label='Equals Sign', variable=sep_char, value=' = ')
seperator_menu.add_radiobutton(label='Colon', variable=sep_char, value=' : ')
menu_bar.add_cascade(label='Seperator', menu=seperator_menu)
root.config(bg='#00004d', menu=menu_bar)

# Configure the grid layout
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

opts_tbox = tkst.ScrolledText(root, width=79, height=20, relief='flat')
opts_tbox.config(bg='#00004d', fg='#ffffff', font=(
    'Arial', 14), insertbackground='#ffffff')
opts_tbox.grid(column=0, row=0, padx=10, pady=5, sticky='nsew')
opts_tbox.focus_set()

# Loop until user exits program
root.mainloop()

License = CC0
 
I have done none of these things, what I've done instead is create a configuration (ini) file creator. It lets you create new and update existing ini files, it supports both the = and : seperators. I just have to finish off the readme file then its done.
When someone makes the thing you didn't know you wanted <3
Although I didn't really mind using a regular text editor to change .ini files.
 
“Starting with Windows 95 Microsoft favored the use of the Windows Registry and began to steer developers away from using INI files for configuration.”

 
do you think I was endorsing windoze registry?
No, I simply am a fan of config files... Windows ME was the latest version of Windows I've ever used.

Although I'm now tempted to install NixOS, so I'll need to work out how that's all going to work in an immutable, declarative environment. Config files are better for tinker-ability.
 
  • Like
Reactions: rSl
I modified my stream oriented network monitor 'pacmon' to only display company owning the ip address ‘corp’ if the terminal is wider than 105 characters.

So expanded it looks like:

1696157461946.png


Collapsed:

1696157511482.png


You still get the country code "CC" column, which I find quite interesting.
 
Last edited:
Back
Top