Tuesday, August 19, 2025

my sunvox shortcuts

reposting this because I put down sunvox for a while and had to relearn it.

  • cyclic shift is #1 the most important shortcut to add.
  • being able to move between patterns is another one.
  • shift space to play from line
  • doing chords with ctrl g b i
  • ctrl p paste evenly
  • ctrl t select track

my sunvox shortcuts

Friday, August 15, 2025

remaping the f310 to send midi with watchdog for auto reload


#!/usr/bin/env python3
import evdev
import rtmidi
from evdev import ecodes
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import os
import sys

DEVICE_PATH = '/dev/input/by-id/usb-Logitech_Logitech_Dual_Action_DF5CB332-event-joystick'

# ----------------------------
# Corrected human-readable button mappings
# ----------------------------
buttons = {
    'A': 61,    # physical A triggers MIDI note B
    'B': 62,    # physical B triggers MIDI note X
    'X': 60,    # physical X triggers MIDI note A
    'Y': 63,
    'L': 64,
    'R': 65,
    'Select': 66,
    'Start': 67,
    'Up': 68,
    'Down': 69,
    'Left': 70,
    'Right': 71
}

evdev_button_map = {
    288: 'A',
    289: 'B',
    290: 'X',
    291: 'Y',
    292: 'L',
    293: 'R',
    296: 'Select',
    297: 'Start',
    294: 'Up',
    295: 'Down',
    298: 'Left',
    299: 'Right'
}

# ----------------------------
# Axis mappings
# ----------------------------
axes = {
    'LX':  (10, -32768, 32767),
    'LY':  (11, -32768, 32767),
    'LT':  (12, 0, 255),
    'RT':  (13, 0, 255),
    'RX':  (14, -32768, 32767),
    'RY':  (15, -32768, 32767)
}

evdev_axis_map = {0: 'LX', 1: 'LY', 2: 'LT', 5: 'RT', 3: 'RX', 4: 'RY'}

# ----------------------------
# MIDI setup
# ----------------------------
midi_out = rtmidi.MidiOut()
midi_out.open_virtual_port("F310 MIDI")

def scale(value, min_val, max_val):
    return int((value - min_val) / (max_val - min_val) * 127)

# ----------------------------
# Main gamepad loop
# ----------------------------
def run():
    gamepad = evdev.InputDevice(DEVICE_PATH)
    print(f"Listening on {gamepad.name} ({gamepad.path})")
    for event in gamepad.read_loop():
        if event.type == ecodes.EV_KEY and event.code in evdev_button_map:
            label = evdev_button_map[event.code]
            note = buttons[label]
            if event.value == 1:
                midi_out.send_message([0x90, note, 112])
                print(f"Button pressed: {label}")
            elif event.value == 0:
                midi_out.send_message([0x80, note, 0])
        elif event.type == ecodes.EV_ABS and event.code in evdev_axis_map:
            label = evdev_axis_map[event.code]
            cc, min_val, max_val = axes[label]
            val = scale(event.value, min_val, max_val)
            midi_out.send_message([0xB0, cc, val])

# ----------------------------
# Watchdog for hot-reload
# ----------------------------
class ReloadHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path.endswith(os.path.basename(__file__)):
            print("Script changed. Restarting...")
            os.execv(sys.executable, ['python3'] + sys.argv)

observer = Observer()
observer.schedule(ReloadHandler(), path='.', recursive=False)
observer.start()

# ----------------------------
# Run forever
# ----------------------------
try:
    while True:
        run()
except KeyboardInterrupt:
    observer.stop()
observer.join()


Thursday, August 14, 2025

1 liner gpg encryption + qr

gpg - c creates, gpg - d decodes
this uses python qrcode (pip install it if you dont have it)


read -p "Input GPG file: " infile; read -p "Output PNG file: " outfile; python3 -c "import qrcode, base64; f=open('$infile','rb'); data=base64.b64encode(f.read()).decode(); f.close(); qrcode.make(data).save('$outfile')"

this passes the input of the qr as input and decodes the gpg (requires pyzbar. opencv is good to have also


read -p "QR PNG file: " qrfile; read -p "Output file: " outfile; python3 -c "import cv2, pyzbar.pyzbar as pyzbar, base64, sys; img=cv2.imread('$qrfile'); data=pyzbar.decode(img)[0].data; sys.stdout.buffer.write(base64.b64decode(data))" | gpg -d > "$outfile"

Saturday, August 9, 2025

tgpt ios push notifications from anywhere with pi connect

This script lets you ask tgpt a question and it will send the response as notification to your phone
using the ios app ntfy.sh
you can remotely trigger it outside your local network using raspberry pi connect

create this bash alias on your pi
alias ntfygpt='f(){ curl -d "$(tgpt -q "$*")" https://ntfy.sh/YOURTOPICGOESHERE; }; f'

make sure YOURTOPICGOES HERE is replaced on your phone, thats where it will be sent to

Friday, August 8, 2025

Udev Rules and Systemd Service for Auto Running python scripts on USB insert / removal

How to Run .py When usb is plugged/unplugged

1. /etc/udev/rules.d/99-gamepad.rules - CREATED

# Start service when F310 is plugged in
ACTION=="add", SUBSYSTEM=="input", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c216", KERNEL=="event*", TAG+="systemd", ENV{SYSTEMD_WANTS}="macros@%k.service"

# Stop service when F310 is unplugged
ACTION=="remove", SUBSYSTEM=="input", ENV{ID_MODEL}=="Logitech_Dual_Action", KERNEL=="event*", RUN+="/bin/systemctl stop macros@%k.service"

Purpose: Detects when the Logitech F310 gamepad (product ID c216) is plugged in or unplugged and triggers systemd service actions.

2. /etc/systemd/system/macros@.service - CREATED

[Unit]
Description=Logitech F310 Macros for %i
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/mint22/macros.py
Restart=on-failure
User=mint22
Group=mint22
Environment=HOME=/home/mint22
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Purpose: Systemd template service that runs the Python script when triggered by udev. The @ makes it a template service that can be instantiated with device names (like macros@event13.service).

3. /home/mint22/macros.py - EXISTING (permissions updated)

Changes made:

  • Ensured executable permissions: chmod +x /home/mint22/macros.py
  • Added user to input group: sudo usermod -a -G input mint22

Purpose: Your existing Python script that contains the gamepad macro functionality.

Commands Run to Apply Changes:

# Reload udev rules to recognize the new gamepad detection rule
sudo udevadm control --reload-rules

# Reload systemd to recognize the new service template
sudo systemctl daemon-reload

# Set proper permissions
chmod +x /home/mint22/macros.py
sudo usermod -a -G input mint22

How It Works:

  1. When F310 is plugged in → udev detects it → starts macros@eventX.service → runs macros.py
  2. When F310 is unplugged → udev detects removal → stops the service → terminates macros.py

The system automatically handles starting and stopping the script based on the physical presence of the gamepad.

prettify json from cli with jq and this bash alias


alias prettifyjson='f(){ jq . "$1" > tmp && mv tmp "$1"; }; f'
source ~/.bashrc

Thursday, August 7, 2025

Using Logitech FCB310 Gamepad as a Macropad on Raspberry Pi 4

This tutorial shows how to use your Logitech FCB310 USB gamepad as a macropad on a Raspberry Pi 4, with automatic startup and hotplug detection. When plugged in, your gamepad buttons will trigger keyboard macros on the Pi, no manual script launching needed.


Requirements

  • Raspberry Pi 4 with Raspberry Pi OS (desktop)
  • Logitech FCB310 USB Gamepad
  • Internet connection for installing packages

Step 1: Install Required Software

Open a terminal and run:

sudo apt update
sudo apt install python3-pip xdotool
pip3 install inputs pyudev watchdog
  • xdotool: simulates keyboard keypresses
  • inputs: reads gamepad events
  • pyudev: detects USB device plug/unplug
  • watchdog: monitors macro config file changes

Step 2: Prepare Macro Configuration File

Create a CSV file to map gamepad buttons to keyboard shortcuts.

Example file: /home/pi/macropad/macros.csv

BTN_A,ctrl+alt+t
BTN_B,ctrl+w
  • First column: gamepad button code (e.g., BTN_A)
  • Second column: key combo for xdotool (e.g., ctrl+alt+t)

Step 3: Create the Macro Script

Create a folder and the Python script:

mkdir -p ~/macropad
vim ~/macropad/gamepad_macro.py

Paste this full script into it:

import csv
import subprocess
from inputs import get_gamepad
import pyudev
import threading
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time

mapping = {}

def load_macros():
    global mapping
    mapping = {}
    try:
        with open("/home/pi/macropad/macros.csv", newline='') as csvfile:
            reader = csv.reader(csvfile)
            for row in reader:
                if len(row) >= 2:
                    btn = row[0].strip()
                    keys = row[1].strip()
                    mapping[btn] = [keys]
        print("Macros reloaded:", mapping)
    except Exception as e:
        print("Failed to load macros:", e)

def send_macro(keys):
    for combo in keys:
        subprocess.run(["xdotool", "key", combo])

def listen_gamepad(stop_event):
    while not stop_event.is_set():
        try:
            events = get_gamepad()
            for event in events:
                if event.ev_type == "Key" and event.state == 1:
                    if event.code in mapping:
                        send_macro(mapping[event.code])
        except Exception:
            pass

class ConfigChangeHandler(FileSystemEventHandler):
    def on_modified(self, event):
        if event.src_path.endswith("macros.csv"):
            print("Config file changed, reloading macros")
            load_macros()

def device_event(observer, device):
    global gamepad_thread, stop_event
    if device.action == "add" and "event" in device.device_node:
        print("Gamepad connected, starting listener")
        load_macros()
        if gamepad_thread and gamepad_thread.is_alive():
            stop_event.set()
            gamepad_thread.join()
        stop_event.clear()
        gamepad_thread = threading.Thread(target=listen_gamepad, args=(stop_event,), daemon=True)
        gamepad_thread.start()
    elif device.action == "remove":
        print("Gamepad disconnected")
        stop_event.set()
        if gamepad_thread:
            gamepad_thread.join()

if __name__ == "__main__":
    stop_event = threading.Event()
    gamepad_thread = None

    context = pyudev.Context()
    monitor = pyudev.Monitor.from_netlink(context)
    monitor.filter_by('input')

    observer = pyudev.MonitorObserver(monitor, device_event)
    observer.start()

    # Watch macros.csv for changes
    config_handler = ConfigChangeHandler()
    config_observer = Observer()
    config_observer.schedule(config_handler, path="/home/pi/macropad/", recursive=False)
    config_observer.start()

    print("Waiting for gamepad to connect...")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        stop_event.set()
        if gamepad_thread:
            gamepad_thread.join()
        config_observer.stop()
        config_observer.join()

Step 4: Make Script Executable

chmod +x ~/macropad/gamepad_macro.py

Step 5: Setup Autostart with systemd

Create a service file:

sudo vim /etc/systemd/system/macropad.service

Add:

[Unit]
Description=Gamepad Macro Pad Service
After=graphical.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/macropad/gamepad_macro.py
Restart=always
User=pi

[Install]
WantedBy=graphical.target

Enable and start service:

sudo systemctl enable macropad.service
sudo systemctl start macropad.service

Step 6: Reboot and Test

Reboot your Pi:

sudo reboot
  • Plug in your FCB310 gamepad.
  • Press buttons mapped in macros.csv.
  • Macros should trigger automatically as keyboard inputs.

Customization

  • Edit /home/pi/macropad/macros.csv anytime.
  • The script auto-reloads macros on file changes.
  • Add/remove mappings without restarting.

Troubleshooting

  • Ensure your gamepad device shows up in /dev/input/ (use evtest to confirm).
  • Adjust key combos to fit your needs (see xdotool docs).
  • Check logs with journalctl -u macropad.service -f.

Tuesday, July 29, 2025

wpa_supplicant no longer works to setup wifi on boot

nmtui worked for me to connect my rav filehub
I'm using it so I can run a server with music on a raspberry pi that I can connect to from the ios files app
It's cool because I can use Tau DJ without worrying about running out of internal storage space

Tuesday, July 22, 2025

Kwanzaa Fonts

don't sleep on the kwanzaa Fonts

the google fonts link
  • Monoton
  • Bungee Hairline
  • Sankofa Display

Monday, July 21, 2025

fixing smb read only from pi to ios

add to /etc/samba/smb.conf

force user = bweew
vfs objects = streams_xattr

Friday, July 18, 2025

loopy pro + bs-16

Instrument MIDI Command
drums B0 00 78 B0 20 00 C0
piano B0 00 00 B0 20 00 C0 01
bass B0 00 00 B0 20 00 C0 21
jazz-gt B0 00 00 B0 20 00 C0 1A

on release, scroll down to the bottom where Midi Actions are to choose send midi message. Custom hex midi messages are key! Before I tried using program change and it wouldn't let me get my drums even if i told it it send on midi channel 10.

my updated loopy pro template

zxcv records first 4 loops, asdf selects drums,bass,jazzgt,piano. I added buttons to select other sounds, kept it small to work on an iphone se but more roomy on a bigger screen of course.

bash ghostscript conversion of color pdfs to b&w


#!/bin/bash
# Loop through all PDF files in the current directory
for file in *.pdf; do
  # Skip if no PDF files
  [ -e "$file" ] || continue

  # Set output file name
  output="${file%.pdf}.bw.pdf"

  echo "Converting: $file -> $output"

  # Ghostscript command to convert to grayscale
  gs \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.4 \
    -dProcessColorModel=/DeviceGray \
    -dColorConversionStrategy=/Gray \
    -dColorConversionStrategyForImages=/Gray \
    -dAutoRotatePages=/None \
    -dNOPAUSE -dBATCH -dQUIET \
    -sOutputFile="$output" "$file"
done

Tuesday, July 15, 2025

offline transcription/dictation on raspberry pi with vosk

I installed vosk in a venv inside a directory for nerd-dictation which is another script that works great if you want to run vosk in the background and output it into vim. Heres my transcribe.sh for running vosk-transcriber on audio files


#!/bin/bash
# Activate the virtual environment
source "$HOME/.applications/nerd-dictation/venv/bin/activate"
# Check if a file argument was provided
if [[ -z "$1" ]]; then
    echo "Usage: $0 "
    exit 1
fi
AUDIO_FILE="$1"
# Check that the file exists
if [[ ! -f "$AUDIO_FILE" ]]; then
    echo "Error: File '$AUDIO_FILE' not found."
    exit 1
fi
# Run transcription and output to file
vosk-transcriber -i "$AUDIO_FILE" -o test.txt
# Print the output to the terminal
echo "Transcription output:"
cat test.txt

heres my vosk.sh for running nerd-dictation


#!/bin/bash
# Absolute path to the project
BASEDIR="$HOME/.applications/nerd-dictation"
# Activate the virtual environment
source "$BASEDIR/venv/bin/activate"
# Run nerd-dictation with the 'begin' command
"$BASEDIR/nerd-dictation" begin

shapescript is like openscad for iphones

came across this 5mb app on the hunt for a parametric modeller for cad stuff. you can import text files extrude them, set the background green and key them out in lumafusion to add cool 3d animated text. This is my basic script:

define words import "Text.txt"

font "Menlo-Bold"
color grey

extrude {
  size 2 2 0.5 
  metallicity 0.9

  text words
}
//background green

shapescript mobile on the app store

Thursday, July 10, 2025

png to svg by ethisham niazi

a 6.99$ cad vectorizing app that seems promising for local offline use, 15mb. its nice to see something thats a one time payment instead of subscription.

heres the link to it
on the app store

Tuesday, July 8, 2025

list of tall condensed fonts for movie posters

Font Name Style Common Use Case License Info
Bebas Neue All-caps, tall, condensed Action, thriller, indie posters Free for commercial use
League Spartan (Condensed) Bold, geometric, narrow Modern drama, minimalist films Open source (OFL)
Nexa Light / Thin Light, clean, minimalist Sci-fi, tech, design-driven Commercial license needed
Futura Condensed Geometric, classic sans Sci-fi, classic films Commercial license needed
Gotham Narrow / Light Modern, versatile sans Drama, thriller, biopics Commercial license (Hoefler)
Roboto Condensed Light Digital, minimal Sci-fi, modern thrillers Free (Google Fonts)
Helvetica Neue Thin Sleek, iconic sans Drama, minimalist Commercial license (Adobe)
DIN Condensed Industrial, narrow, bold Thriller, noir, military themes Commercial license needed
Montserrat Thin Elegant, modernist Romance, indie, drama Free (Google Fonts)
Eurostile Condensed Futuristic, squarish Cyberpunk, tech, space themes Commercial license needed

minimal raspberry pi os file manager lacked an unzip option

The fix - thunar archive plugin
I knew I needed xarchiver but despite being installed it wasn't showing up. what i needed was the plugin version


sudo apt install xarchiver thunar-archive-plugin

converting csv to xlsx on ios

csvxlsx converter app on the ios app store

Affinity publisher on ipad doesn't support csv imports. Datamerge is only on the desktop version. You can import xlsx spread sheets. I prefer being able to quickly enter in data using textastic as csv or shortcuts actions to streamline the prompting of forms for quickly capturing things. I opened up an xlsx made from some free csv converter websites hoping it would look like xml but it was unreadable junk. Thankfully I found a small app that does exactly what I want locally it was only a buck and it doesn't ask for permissions or take up tons of space. numbers is great but its huge. This is perfect because its only 2mb. Hopefully affinity adds csv support but for now im happy with this work around for prettying up my tables.

Learn To Speak Typographers Slang - A Glossary of Type

Term Definition
BaselineThe invisible line on which most letters sit.
Cap Height / Cap LineThe top boundary of uppercase letters.
X‑HeightThe height of lowercase letters (like “x”), excluding ascenders and descenders.
AscenderThe part of a lowercase letter that extends above the x‑height (e.g., “h”, “b”).
DescenderThe part of a lowercase letter that extends below the baseline (e.g., “g”, “y”).
SerifSmall strokes attached at the end of letterforms; found in serif typefaces.
Sans‑Serif / GrotesqueTypefaces without serifs; “Grotesque” is an early sans‑serif category.
Slab SerifSerif typeface with thick, block‑like serifs.
MonospacedA font where each character takes up the same horizontal width.
LigatureTwo or more characters joined into a single glyph (e.g., “fi”, “æ”).
KerningAdjustment of space between specific letter pairs.
TrackingUniform adjustment of spacing across a range of characters.
Leading (Line‑Spacing)Vertical space between baselines of consecutive lines of text.
WeightThe thickness of strokes in a typeface (e.g., Light, Bold).
Italic / ObliqueA slanted version of the font; italics are redesigned, obliques are mechanically slanted.
Typeface vs. FontTypeface is the design; font refers to a specific file or style implementation.
GlyphA single visual representation of a character in a font.
Alternate Glyph / SwashOptional stylized or decorative glyph variations.
Stroke / StemThe lines that make up a glyph; stems are the main vertical strokes.
Bowl / Counter / ApertureEnclosed or partially enclosed spaces in letters; apertures are open counters.
Arm / Leg / Shoulder / SpineSpecific stroke parts—arms and legs extend, shoulders curve, the spine is the central curve of an “S”.
Apex / VertexThe upper (apex) or lower (vertex) pointed junctions of strokes.
ArcA curved stroke element within letters.
Foot / SpurThe base of a stroke or a small projection from a curved stroke.
Ball / Teardrop TerminalRounded decorative stroke endings, often found on serif fonts.
Joint / CrotchThe point where two strokes meet, like in “v”.
Double‑StoryLetters like “a” or “g” with two counters (e.g., Times “a”).
Point SizeThe size of the font, measured in points (~1/72 inch).
Em / En (units)Em equals the current font size; En is half that. Used for spacing metrics.
Condensed / ExpandedWidth-variant styles of a typeface.
ContrastVariation between thick and thin strokes in a font.
Typographic Color / RhythmThe overall texture or ‘grayness’ of text blocks.
Hierarchy / ScaleVisual importance created through size, weight, etc.
Legibility / ReadabilityHow easily text can be read, influenced by spacing, x‑height, etc.
Copyfitting / Optimal Line LengthAdjusting font and layout for readability—ideal line length is typically 50–70 chars.
Widows / Orphans / RiversLayout issues—lone lines or distracting vertical spaces in paragraph text.
Dingbats / FleuronsSymbol or ornamental fonts (bullet fonts, decorative elements).
Drop CapA large initial letter spanning multiple lines.
Pilcrow / Ellipsis / OctothorpSpecial characters like ¶, …, and #.
Raster / Anti‑aliasingPixel rendering of fonts and smoothing techniques on screens.
HintingInstructions in fonts improving legibility at small sizes.
Static / Kinetic / Fluid TypographyStatic, animated, or responsive typographic styles.
Axis / StressThe orientation of stroke thickness variation in letterforms.
Small CapsCapital letterforms scaled to x‑height.
Subscript / SuperscriptSmaller characters positioned below or above the baseline.
GutterSpacing between columns in multi-column layouts.
JustifyAligning text evenly to both left and right margins.
TypographyThe craft and technique of arranging type.
GSUB (Glyph Substitution Table)OpenType table that substitutes glyphs—used for ligatures, alternates, contextual forms. :contentReference[oaicite:1]{index=1}
GPOS (Glyph Positioning Table)OpenType table that handles precise glyph placement—kerning, mark positioning, cursive attachments. :contentReference[oaicite:2]{index=2}
GDEF (Glyph Definition Table)OpenType table that classifies glyphs (base, mark, ligature) and defines caret positions.
BASE (Baseline Table)OpenType table for baseline alignment across scripts (e.g., roman, ideographic, hanging).
JSTF (Justification Table)OpenType table that supports script-specific justification (e.g., Arabic kashida).
UnicodeThe universal character encoding standard covering nearly all scripts and symbols.
BlackletterA Gothic script style (Textura, Fraktur) with medieval calligraphic texture.
Transitional SerifSerif style between old-style and modern (e.g., Baskerville), moderate contrast.
Old‑style SerifSerif faces with diagonal stress and bracketed serifs; inspired by Renaissance writing.
Didone / Modern SerifHigh-contrast serif fonts with vertical stress and fine hairlines (e.g., Bodoni).
Display TypefaceHighly stylized fonts for headlines or large sizes, often too decorative for body text.
Text TypefaceFonts optimized for body text and readability at small sizes.
Geometric Sans‑SerifSans fonts based on simple geometric shapes (e.g., Futura).
Humanist Sans‑SerifSans faces with calligraphic influence and subtle stroke contrast.
Neo‑Grotesque Sans‑SerifNeutral, modern sans-serifs (e.g., Helvetica, Univers).
Script TypefaceTypefaces that mimic cursive handwriting or calligraphy.
Variable FontA single font file that supports multiple axes (weight, width, optical size).
Ligature CaretA marker in ligature glyphs to define cursor/caret placement.
Contextual Alternates (calt)An OpenType feature for substituting glyphs based on context.
Stylistic Set (ssXX)Predefined alternate glyph sets that can be turned on manually.
Oldstyle Figures (onum)Numerals with varied heights and alignments for flowing text.
Lining Figures (lnum)Numerals aligned to cap height, consistent with uppercase letters.
Proportional Figures (pnum)Numbers with variable widths designed for visual harmony.
Tabular Figures (tnum)Monospaced numerals for tables and aligned columns.
Discretionary Ligatures (dlig)Decorative ligatures applied optionally for stylistic effect.
Fractions (frac / afrc)OpenType features that auto-create fraction glyphs.
Swash CapitalsHighly decorative uppercase glyphs, often with flourishing strokes.
Initial/Final Forms (init / fina)Contextual forms used at the beginning or end of words (common in Arabic).
Split DiacriticsDiacritics positioned separately from base glyphs (e.g., Vietnamese).
Glyph CoverageThe set of Unicode blocks and scripts supported by a font.
Script TagAn OpenType label identifying the script for a set of features (e.g., “latn”).
Feature TagA four-letter code defining OpenType features (e.g., kern, liga).
Lookup TableA GSUB/GPOS structure defining specific substitutions or positioning rules.
Coverage TableSpecifies which glyphs are affected by a lookup in GSUB/GPOS.

9 hour font making tutorial

bewilder entertainment's youtube video showing how to use inkscape and fontforge to make a font

Fixing Screen Resolution On Raspberry Pi 4 Running Wayland Labwc and Raindrop With i3wm

Arandr was scriptable and made sense after being replaced with raindrop I couldn't find any info on setting up a config for raindrop the drop in Arandr replacement. First I added an exec no startup id to load raindrop on login with i3 but I finally came up with a better solution.


  exec --no-startup-id xrandr --output HDMI-1 --mode 1680x1050
  

The raspberry pi loads perfectly when I am on my smaller computer monitor but when on the TV text would be cut off on the top of the screen. This was bugging me for ages. I'm glad I finally have this sorted out so all I have to do is plug it in and it auto starts

Wednesday, July 2, 2025

getting mixxx to recognize the fc310 as hid

you need to flick the switch on the back of the controller to d instead of x for direct mode instead of x mode
you get a permissions error about usb devices to fix that create a udev rule


sudo vim /etc/udev/rules.d/99-logitech-f310.rules

# Logitech F310 Gamepad in DirectInput mode
KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c216", MODE="0666", GROUP="plugdev"

sudo udevadm control --reload
sudo udevadm trigger

sudo usermod -aG plugdev $USER
my hid mapping

its cool not needing to use antimicrox, this is as far as I got with the mapping. I was hoping to map the superknobs to controll the delay but have'nt figured it out yet
I still need to add the left/right nudge functionality

Tuesday, July 1, 2025

stuff I added to the mixxx custom keyboard config.

shift 1-8 for samples, removed the loop stuff because i never use it,
ctrl vx turn deck 1 super knob up and down c resets
ctrl r angle and m are up and down for deck 2 super knob
ctrl c and ctrl left angle bracket turn super knob send to zero


[Sampler1]
cue_gotoandplay Shift+!

[Sampler2]
cue_gotoandplay Shift+@

[Sampler3]
cue_gotoandplay Shift+#

[Sampler4]
cue_gotoandplay Shift+$

[Sampler5]
cue_gotoandplay Shift+%

[Sampler6]
cue_gotoandplay Shift+^

[Sampler7]
cue_gotoandplay Shift+&

[Sampler8]
cue_gotoandplay Shift+*

// -----------
// THE SUPER KNOB
// -----

[QuickEffectRack1_[Channel1]_Effect1]
enabled b
[QuickEffectRack1_[Channel1]]
super1_down Ctrl+x
super1_set_default Ctrl+c
super1_up Ctrl+v

[QuickEffectRack1_[Channel2]_Effect1]
enabled n
[QuickEffectRack1_[Channel2]]
super1_down Ctrl+m
super1_set_default Ctrl+,
super1_up Ctrl+.

How To Edit Metadata Using Clipboard Managers, Puddletags And Autohotkey

Its like a spreadsheet its really easy to see everything this way.
trying a few clipboard managers out so I don't need to manually type everything out each time.
diodon, parcellite, copyq
out of all of these my favorite is autohotkey
With it I can easily set it up to label genres like shift 1 jungle shift 2 footwork etc..

Monday, June 30, 2025

you can't safely eject usbs on ios

video about it

kind of freaks me out for djing.
tau lets you back up your database to iCloud or dropbox
it's stored locally within the app.
be careful because it might pull down an old version and overwrite your hard work setting cue points and adjusting beat grids.

They say the safest thing is to turn off your device to prevent corrupting it.

  • always make backups!

Tau dj mapping for dj control compact

my hercules dj control compact mapping

They got rid of the tempo faders on this controller. The software workaround is to hold shift and turn the jog wheel but the default mapping doesn't do that. This map fixes that but at the expense of being able to finely nudge which isn't great but its works if you just use the touch screen for that.

Saturday, June 28, 2025

fontforge masterclass

michael harmon is the man for making this fontforge tutorial series on youtube.

Friday, June 27, 2025

renoise defaulting to hdmi on raspberry pi 4 fix

install pipewire-jack and run pw-jack renoise to run it with the jack settting but have it bridged to run in the back with pipewire

Thursday, June 26, 2025

beorg and organice encryption with gnupg

Its a 3.99 IAP
beorg encryption
I usually sync everything in icloud and the notes app lets you lock notes
testing it out by using dropbox and syncing notes using organice.200ok.ch
to decrypt on linux:


gpg -d mynote.org

you can use the iSH app to decrypt also


  apk add gnupg
  

gpg -d mynote.org > output.org
that redirects the output from the terminal to a file

Wednesday, June 25, 2025

djay player pro em fix

I was sad
when this app stoped working it was a one time purchase light version without dvs and midi but still very wicked. I was able to still download it and install from under purchase history but it would stuuter.

the fix:
under output options enable experimental 96k output
im so glad it works again
they no longer aell dj player pro
tried to install that and it wouldnt let me subscribe.

the app is now a one time purchase of 50$ called tau djv1

The S Christian Collings GM GS soundfont

GMGS google drive link

reaper config

reaper config

fixing waveshare lcdtft display

sudo vim /boot/config.txt

#on the dtoverlay line add:
fps=30,speed=42000000
#so it reads like

dtoverlay=waveshare35a,fps=30,speed=42000000

this makes it refresh faster at the expense of screwing up the colors a bit

Friday, June 20, 2025

project m visualizer

milkdrop for linux

same post as last but with org export style sheet

setting up i3 on a fresh pi lite

make a file called .xsession

inside it add:

exec i3

add this to .profile

# if tty loads then startx and i3
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
  startx
fi

i3 config

in .config/i3/config put:

# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#

# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!


set $mod Mod4

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 12

# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8

# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex --autostart --environment i3

# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.

# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork

# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet

# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# move tiling windows via drag & drop by left-clicking into the title bar,
# or left-clicking anywhere into the window while holding the floating modifier.
tiling_drag modifier titlebar

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal

# kill focused window
bindsym $mod+Shift+q kill

# start dmenu (a program launcher)
#bindsym $mod+d exec --no-startup-id dmenu_run

# A more modern dmenu replacement is rofi:
 bindsym $mod+d exec "rofi -modi drun,run -show drun"

# There also is i3-dmenu-desktop which only displays applications shipping a
# .desktop file. It is a wrapper around dmenu, so you need that installed.
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop

# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right

# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+semicolon move right

# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# split in horizontal orientation
bindsym $mod+h split h

# split in vertical orientation
bindsym $mod+v split v

# enter fullscreen mode for the focused container
bindsym $mod+m fullscreen toggle

# change container layout (stacked, tabbed, toggle split)
#bindsym $mod+s layout stacking
#bindsym $mod+w layout tabbed
#bindsym $mod+e layout toggle split

# toggle tiling / floating
bindsym $mod+Shift+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle

# focus the parent container
bindsym $mod+a focus parent

# focus the child container
#bindsym $mod+d focus child

# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"

# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10

# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10

# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"

# resize window (you can also use the mouse for that)
mode "resize" {
        # These bindings trigger as soon as you enter the resize mode

        # Pressing left will shrink the window’s width.
        # Pressing right will grow the window’s width.
        # Pressing up will shrink the window’s height.
        # Pressing down will grow the window’s height.
        bindsym j resize shrink width 10 px or 10 ppt
        bindsym k resize grow height 10 px or 10 ppt
        bindsym l resize shrink height 10 px or 10 ppt
        bindsym semicolon resize grow width 10 px or 10 ppt

        # same bindings, but for the arrow keys
        bindsym Left resize shrink width 10 px or 10 ppt
        bindsym Down resize grow height 10 px or 10 ppt
        bindsym Up resize shrink height 10 px or 10 ppt
        bindsym Right resize grow width 10 px or 10 ppt

        # back to normal: Enter or Escape or $mod+r
        bindsym Return mode "default"
        bindsym Escape mode "default"
        bindsym $mod+r mode "default"
}

bindsym $mod+r mode "resize"

# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
        status_command i3status
}

#remove title bar
for_window [class="^.*"] border pixel 0

#open file manager
bindsym $mod+f exec thunar

bindsym $mod+w exec firefox

Created: 2025-06-20 Fri 03:59

i3 on pi lite

setting up i3 on a fresh pi lite

make a file called .xsession

inside it add:

exec i3

add this to .profile

# if tty loads then startx and i3
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
  startx
fi

i3 config

in .config/i3/config put:

# This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#

# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!


set $mod Mod4

# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 12

# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8

# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex --autostart --environment i3

# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.

# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork

# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet

# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status

# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod

# move tiling windows via drag & drop by left-clicking into the title bar,
# or left-clicking anywhere into the window while holding the floating modifier.
tiling_drag modifier titlebar

# start a terminal
bindsym $mod+Return exec i3-sensible-terminal

# kill focused window
bindsym $mod+Shift+q kill

# start dmenu (a program launcher)
#bindsym $mod+d exec --no-startup-id dmenu_run

# A more modern dmenu replacement is rofi:
 bindsym $mod+d exec "rofi -modi drun,run -show drun"

# There also is i3-dmenu-desktop which only displays applications shipping a
# .desktop file. It is a wrapper around dmenu, so you need that installed.
# bindcode $mod+40 exec --no-startup-id i3-dmenu-desktop

# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right

# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right

# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+semicolon move right

# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right

# split in horizontal orientation
bindsym $mod+h split h

# split in vertical orientation
bindsym $mod+v split v

# enter fullscreen mode for the focused container
bindsym $mod+m fullscreen toggle

# change container layout (stacked, tabbed, toggle split)
#bindsym $mod+s layout stacking
#bindsym $mod+w layout tabbed
#bindsym $mod+e layout toggle split

# toggle tiling / floating
bindsym $mod+Shift+space floating toggle

# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle

# focus the parent container
bindsym $mod+a focus parent

# focus the child container
#bindsym $mod+d focus child

# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"

# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10

# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10

# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"

# resize window (you can also use the mouse for that)
mode "resize" {
        # These bindings trigger as soon as you enter the resize mode

        # Pressing left will shrink the window’s width.
        # Pressing right will grow the window’s width.
        # Pressing up will shrink the window’s height.
        # Pressing down will grow the window’s height.
        bindsym j resize shrink width 10 px or 10 ppt
        bindsym k resize grow height 10 px or 10 ppt
        bindsym l resize shrink height 10 px or 10 ppt
        bindsym semicolon resize grow width 10 px or 10 ppt

        # same bindings, but for the arrow keys
        bindsym Left resize shrink width 10 px or 10 ppt
        bindsym Down resize grow height 10 px or 10 ppt
        bindsym Up resize shrink height 10 px or 10 ppt
        bindsym Right resize grow width 10 px or 10 ppt

        # back to normal: Enter or Escape or $mod+r
        bindsym Return mode "default"
        bindsym Escape mode "default"
        bindsym $mod+r mode "default"
}

bindsym $mod+r mode "resize"

# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
        status_command i3status
}

#remove title bar
for_window [class="^.*"] border pixel 0

#open file manager
bindsym $mod+f exec thunar

bindsym $mod+w exec firefox

Created: 2025-06-20 Fri 03:57

Thursday, June 19, 2025

clipart links

victorian

openclipart

dat

dat link

cc search

rectangular dividers

punk flyers

ms clipart searchdb

Encrypting text in vim with the vim-gnupg plugin


Plug 'jamessan/vim-gnupg'

" GPG SETTINGS for just password
let g:GPGPreferSymmetric = 1
" gpg so temp is also encrypted
" Prevent backup files (avoid leaving decrypted content on disk)
set nobackup
set nowritebackup
" Encrypt temporary files too
let g:GPGUseAgent = 1

Add above to vimrc and below to bashrc


# vim gpg
GPG_TTY=`tty`
export GPG_TTY

This symmetrical encryption prompts for a password on save and for 10 mins lets you re-open without a password in vim. To clear the cache so you are prompted immediately run in the terminal:


gpgconf --kill gpg-agent

Wednesday, June 18, 2025

how to get app image icons

I downloaded FreeCad as an app image I want to create a desktop shortcut but I needed an Icon


./freecad.AppImage --appimage-extract

Tuesday, June 17, 2025

mixxx export playlist as csv run csvkit on it to find duration of set


csvtool col 4 vertagogo.csv | tail -n +2 | awk -F: '{
    min=$1;
    sec=$2;
    total += min * 60 + sec;
} END {
    h = int(total / 3600);
    m = int((total % 3600) / 60);
    s = total % 60;

    if (h > 0) {
        printf "Total Duration: %d hour%s %d minute%s %d second%s\n",
            h, (h!=1?"s":""),
            m, (m!=1?"s":""),
            s, (s!=1?"s":"");
    } else if (m > 0) {
        printf "Total Duration: %d minute%s %d second%s\n",
            m, (m!=1?"s":""),
            s, (s!=1?"s":"");
    } else {
        printf "Total Duration: %d second%s\n", s, (s!=1?"s":"");
    }
}'

Assuming duration is in the 4th col then this script works
I also jumped through some hoops trying to figure out a way to sort them in the CLI by bpm but you can just click on them in mix.

Monday, June 16, 2025

printing csv as html tables using basic shell tools like tail

this shell script makes an html table out of a simple 2 col csv


#!/bin/sh
echo ""
echo "  "
echo "  "
tail -n +2 "$1" | awk -F',' '{print "    "}'
echo "  "
echo "
itemquantity
" $1 "" $2 "
"

I don't want to install numbers on my Ipad. A-shell mini/pythonista can run csvkit (csvtools is another good one) instead to do alot of basic data

  • shortcuts - data fetching, logging, file management
  • a-shell mini - csvtools, awk, sed, (maybe even a little grep)
  • pythonista - data analysis/ visualizations

Friday, June 13, 2025

my renoise shortcuts

linked from my other blog, was wondering why I couldn't find it on this blog

Making Shipping Labels In Calc

macmost did a cool tutorial using apple numbers and pages

The way I would do it before was to use scribus but then I found pages can do linked text boxes.


Heres how you would do the formula to get the same result in libre office calc


=A2 & CHAR(10) & B2 & CHAR(10) & C2

Monday, June 9, 2025

10 fun math tricks for predicting the future with forecasts

# Math Trick Description Use Case Example
1 Moving Averages Smooths data using a rolling average (SMA, WMA, EMA) Forecasting trends in sales or traffic
2 Exponential Smoothing Weights recent data more for responsive short-term forecasting Predicting next day's value
3 Linear Regression Fits a straight trend line to data Predicting future sales or prices
4 Polynomial Regression Fits a curve to account for nonlinear trends Modeling growth with acceleration
5 Logarithmic/Exponential Trend Fits curved models like exponential or logarithmic Forecasting growth or decay
6 Percent Change / Growth Rate Uses % increase/decrease to project future values Estimating next month's revenue
7 Seasonal Averaging Averages data by time periods (month, week, etc.) Forecasting monthly sales
8 Rolling Regression Applies linear regression over a sliding window Short-term stock price prediction
9 Z-Score Anomaly Detection Identifies and removes outliers using standard deviations Cleaning noisy time series
10 Fourier Transform (FFT) Finds cyclical patterns via frequency analysis Detecting seasonality in demand patterns

why not have another 10?

# Math Trick Description Use Case Example
11 CAGR (Compound Annual Growth Rate) Measures average annual growth rate over time Forecasting investment growth
12 Autoregressive (AR) Models Uses past values to predict the next one Time series forecasting like AR(1), AR(2)
13 Differencing (Δ) Subtracts previous values to remove trend or seasonality Stationarizing a time series
14 Cumulative Sum (CUSUM) Tracks cumulative change from a reference point Detecting slow shifts in process metrics
15 Holt-Winters (Triple Smoothing) Adds seasonality and trend to exponential smoothing Forecasting seasonally fluctuating data
16 Simple Lagged Features Adds previous values as new columns Enhancing model input with past behavior
17 Normalization/Standardization Scales data to make it comparable or Gaussian Preprocessing before regression or modeling
18 Clustering for Pattern Detection Groups similar trends using K-means or DBSCAN Discovering behavior groups in data
19 Savitzky–Golay Filter Smooths data while preserving shape Denoising noisy sensor or measurement data
20 Quantile Forecasting Predicts a range (not just average) using percentiles Risk modeling, demand estimation with bounds

10 more

# Math Trick Description Use Case Example
21 Slope Calculation (Rate of Change) Measures steepness between data points Detecting acceleration in trends
22 Cross-Correlation Measures similarity between two time series Lag detection between related variables
23 Seasonality Index Normalizes values by seasonal averages Adjusting for repeating seasonal patterns
24 Principal Component Analysis (PCA) Reduces dimensionality while preserving variance Feature compression before modeling
25 Residual Analysis Analyzes difference between actual and predicted values Improving model accuracy by modeling errors
26 Bootstrapping Resamples data with replacement to estimate confidence intervals Estimating forecast uncertainty
27 Time Series Decomposition Separates series into trend, seasonality, and residual Understanding data components for forecasting
28 Interpolation Fills in missing values between known data points Reconstructing incomplete datasets
29 Weighted Least Squares (WLS) Linear regression giving more weight to certain data points Handling heteroscedasticity in data
30 Bayesian Updating Updates forecast with new data based on prior beliefs Dynamic forecasting as new data arrives
# Math Trick Description Use Case Example
31 K-Nearest Neighbors (KNN) Forecasting Predicts based on the average of similar past patterns Forecasting similar behavior sequences
32 Dynamic Time Warping (DTW) Measures similarity between time series with time shifts Comparing sequences with misaligned timing
33 Prophet Model (by Facebook) Decomposable time series model with trend, seasonality, holidays Business forecasting with multiple components
34 Recurrent Patterns Detection Identifies repeating patterns in time series Analyzing periodic signals
35 Residual Smoothing Smooths the error component of a forecast Reducing noise in forecast residuals
36 Rolling Median Like moving average, but uses median for robustness to outliers Smoothing noisy data with outlier resistance
37 Data Binning Groups continuous values into categories Trend simplification or histogram generation
38 Signal Denoising (Wavelet Transform) Removes high-frequency noise while preserving structure Processing raw sensor or stock data
39 Granger Causality Test Determines if one time series can predict another Identifying causal predictors
40 Lead-Lag Analysis Measures which variables lead or follow others in time Input feature timing alignment
41 Change Point Detection Detects shifts in trend or distribution Finding when market behavior changes
42 Trend Strength Index Quantifies how strong the trend is Deciding if forecasting is appropriate
43 Signal-to-Noise Ratio (SNR) Compares signal strength to background noise Evaluating data quality for prediction
44 Elastic Net Regression Combines Lasso and Ridge for robust regression Forecasting with high-dimensional features
45 Lag Correlation Matrix Compares correlation across time lags Feature selection from past data
46 Time-Weighted Averages Weighs recent data more heavily based on time decay Real-time adaptive forecasting
47 Histogram-Based Forecasting Predicts based on distribution of past values Probabilistic forecasting from historical data
48 Rolling Standard Deviation Tracks volatility over time Measuring uncertainty or instability
49 Confidence Interval Forecasting Predicts with upper and lower bounds Risk-aware forecasting
50 Ensemble Averaging Combines forecasts from multiple models Improving accuracy through diversity