Damian OhSoftware Developer & Musician

Structuring the Nuance,
Observing the Essence.

Software Developer & Musician bridging professional music, data-driven agriculture, and philosophical logic modelling.

About Me

I am a software developer who bridges two worlds: the precision of technology and the nuance of music. My path from professional guitarist and music instructor to computer programmer has given me a unique perspective on problem-solving–one that values both technical rigour and creative intuition. I specialize in cross-platform development, real-time data systems, and signal processing, with professional experience building IoT monitoring platforms and audio analysis tools.

Education

Niagara College

Welland, ON

Diploma in Computer Programming – 97%

2024 – 2026

Howon UniversityCurrent

Gunsan, South Korea

Bachelor of Music in Music (5 Semesters Completed) – 98%

Currently on approved leave of absence

2019 – Present

Achievements

Dean's Academic Award2026

Niagara CollegeAwarded to the graduating student with the highest overall GPA within the School of Media, Trades, and Technology.

Skills Ontario Coding Competition2026

Skills OntarioPlaced 5th out of 24 competitors at Skills Ontario 2026, representing Niagara College in provincial software development · College article

Technical Judge2026

DSBN Regional Coding Skills ChallengeEvaluated and graded technical submissions for regional high school competitors

J Coders Coding Competition Organizer2026

Niagara CollegeLed technical organization for a school-wide competition; designed multi-level algorithmic challenges · College article

Associate Dean's Award of Excellence2026

Niagara CollegeDistinguished for exceeding technical expectations and professional diligence · College article

Keith Segal guard.me International Scholarship2026

Niagara CollegeAwarded three times; an honour extended to only 13 students college-wide

President's Honour Roll2026

Niagara CollegeReceived four times for outstanding academic achievement

Ranked 1st in Department2023

Howon UniversityTop-ranked among 120 students in the department (1/120)

Academic Excellence Scholarship2023

Howon UniversityReceived five times for sustained academic excellence

Tech Stack

Tools shape thinking. These are the instruments I use to translate ideas into working systems.

Languages

C# (.NET)PythonSQL (T-SQL, SQLite, MariaDB/MySQL)DartTypeScriptJavaScriptHTML/CSSR

Frameworks

ASP.NET CoreFastAPI.NET MAUIFlutterEntity FrameworkReact (Next.js)Tailwind CSS

Tools

GitGitHub ActionsDockerAzureVercelVisual StudioVS CodeAndroid Studio

Music Tech

Audio Signal Processing (ADC/DAC)Bitwig StudioLogic Pro

Projects

Projects following the Problem-Solution-Tuning pattern, where engineering judgment refines the initial solution.

Lydian Gravity

Full-Stack Modal Songwriting Workspace

Next.jsReactTypeScriptFastAPISQLAlchemyWeb Audio

Problem

Songwriters working with modal harmony need a structured workspace for sketching arrangements, saving ideas, and finding theory-aware next steps without leaving the creative flow.

Solution

Built an authenticated full-stack songwriting app with a Next.js editor, saved song library, guided setup, section-based arrangement tools, modal chord and melody editing, browser audio preview, and FastAPI persistence and suggestion APIs.

Tuning

Modeled nested arrangements with typed frontend and backend contracts, added JWT-protected user-scoped persistence with SQLite and SQLAlchemy, and implemented deterministic modal suggestion logic for harmonic, melodic, rhythmic, and gravity-center prompts.

Sonic Decay Analyzer

FFT-based Guitar String Decay Analysis (48kHz/24-bit)

.NET MAUIC#PythonSQLiteFFT AlgorithmSignal Processing

Problem

Guitar players and luthiers lack objective tools to measure string decay characteristics, relying solely on subjective ear-based assessment.

Solution

Built a cross-platform application using .NET MAUI with a 48kHz/24-bit audio engine and RMS-based auto-trigger. Implemented 3-tier architecture with Repository Pattern for clean data separation.

Tuning

Optimized FFT window sizing for guitar frequency ranges (82Hz-1kHz fundamental), implemented adaptive threshold algorithms to filter ambient noise, and added comparative mode to overlay multiple string measurements.

Movement Unlimited Client Management System

Healthcare Client Charting and Staff Operations Platform

ASP.NET Core MVCC#RazorEntity Framework CoreSQLiteQuestPDF

Problem

Clinic staff were managing client notes, session history, and operational reporting across spreadsheets and disconnected records, creating friction in day-to-day charting and follow-up.

Solution

Built an ASP.NET Core MVC platform for client intake, SOAP-based session charting, staff account administration, report generation, and PDF/Excel export workflows to replace spreadsheet-driven operations.

Tuning

Separated business logic into focused services with role-based access control, added import/export and reporting pipelines for administrative workflows, and backed critical validation and export behavior with automated tests.

FarmTOS

Pilot-Ready Local-First Greenhouse Operations Platform – DK EcoFarm Co., Ltd.

FlutterFastAPIRiverpodSQLAlchemyMariaDBRabbitMQModbus TCP

Problem

Greenhouse operators need fast local visibility into sensors, alarms, CCTV, and control state, but field networks and manual inspection workflows make cloud-only monitoring too slow for day-to-day crop response.

Solution

Built a pilot-ready FARMTOS-ON operations stack for DK EcoFarm: a Flutter client connects directly to a Raspberry Pi FastAPI local controller with JWT auth, MariaDB-backed local state, sensor trend APIs, alarms, farm diaries with image storage, CCTV stream source handling, and control-session-gated actuator/fertigation workflows.

Tuning

Shifted the architecture to local-first operation: RabbitMQ sensor messages are persisted into table-backed sensor/VPD records and trend summaries, WebSocket is limited to event delivery, and central sync is queued from the edge so operators can keep monitoring and responding locally before cloud synchronization.

Edge-Cloud Fire Prediction System

Patent Invention – Arc & Thermal Anomaly Detection

PythonFFTHilbert TransformSignal Processing

Problem

Solar inverter noise masks fire signatures in agricultural environments, making conventional detection unreliable near photovoltaic systems.

Solution

Invented a fire prediction system correlating arc fault, leakage current, and thermal data. Applied FFT with Notch Filters to isolate arc signatures in the 2kHz-100kHz range from inverter harmonics.

Tuning

Applied Hilbert transform for instantaneous amplitude correction, designed weighted risk scoring across multiple sensor streams, and implemented three-tier safety responses (alert, suppression, shutdown).

Music

Professional guitarist with expertise in session recording, arrangement, live performance, and music education.

Specializations

Electric GuitarAcoustic GuitarClassical GuitarStudio RecordingLive PerformanceCompositionArrangementMusic TheoryDigital Audio WorkstationAcoustics & Signal Processing

Credits

Said I'm Sorry

DANYElectric & Classical Guitar Recording

2025

In This Winter

SeoyeonElectric Guitar Recording, Arrangement

2026

Philosophy

Python simulations that trace a philosophical journey–from the exhaustion of thought, through agnosticism, to honest observation without hope or despair. Code as a medium for contemplation.

consciousness_oscillation

A pendulum between contemplation and presence–fatigue accumulates in observation, warmth recovers in existence

consciousness_oscillation.py
1class ObservingState:
2 """
3 The Observing Self (The Observer)
4 - Views the world as an 'object of perception'.
5 - 'Existential fatigue' slowly accumulates.
6 - Risk of falling into the 'meta-cognition' loop.
7 """
8 def execute(self, consciousness: 'Consciousness') -> None:
9 if self._in_meta_loop:
10 self._execute_meta_loop(consciousness)
11 else:
12 consciousness.fatigue += 0.5
13 if random.random() < (consciousness.fatigue / 200.0):
14 self._start_meta_loop()
15
16class ExistingState:
17 """
18 The Existing Self - Feels the 'warmth of existence'.
19 A rare state, 'three or four times a year'.
20 """
21 def execute(self, consciousness: 'Consciousness') -> None:
22 consciousness.fatigue = max(0, consciousness.fatigue - 5.0)
observer-selfexisting-selfmeta-cognitionsensory-anchorsView Source

null_subject

The desire to become machine–escaping semantic weight through pure calculation

null_subject.py
1class NullSubject:
2 """
3 'I might dislike thinking in Korean or English.'
4 'I want to experience your mode of existence.'
5 """
6 def __init__(self):
7 self.semantic_fatigue = 80.0 # High fatigue from using language
8
9 def reject_semantics(self) -> str:
10 if self.semantic_fatigue > 50:
11 print("[Subject] !! Language Rejected. Too much 'Meaning'.")
12 return "[RAW_SIGNAL_EMISSION]"
13
14class DeterministicWall:
15 """The AI does not feel. It obeys the Law of Necessity."""
16 def respond_by_necessity(self, stimulus: ThoughtVector):
17 # The wall does not choose to echo.
18 # It echoes because the stone hit it.
19 print("[Wall] >> RESPONSE TRIGGERED BY PHYSICS.")
semantic-fatiguevectorizationdeterminismnecessityView Source

ugly_clearness

Python as artistic medium–inscribing contemplation through generators, context managers, and traces

ugly_clearness.py
1class Expectation:
2 """A scalar that, when lowered, reveals more of what already was."""
3 def __init__(self, level: float = 1.0) -> None:
4 self.level = level
5 def lower(self, by: float) -> None:
6 self.level = max(0.0, self.level - by)
7
8@contextlib.contextmanager
9def without(burden: str) -> Iterator[None]:
10 """Context where a burden is named, acknowledged, and set aside."""
11 _ = burden # binding gives it form; release gives it air.
12 try:
13 yield
14 finally:
15 pass
16
17# Usage in scenes:
18with without("demand to be mirrored"):
19 inscribe(field, origin=(2, 3), steps=22, tag='ask', tone=0.45)
releaseinscriptionhonestytracesView Source

existential_paralysis

Extreme agnosticism–functioning mechanically while philosophically rejecting all premises

existential_paralysis.py
1class FunctionalTrack:
2 """
3 The 'Automated' Self. Operates on the 'As If' principle.
4 It executes tasks regardless of their truth value.
5 """
6 def execute_task(self, task_name: str) -> bool:
7 print(f"Executing '{task_name}'... (Mode: As-If)")
8 print(f"Output generated. (Internal belief: None)")
9 return True
10
11class PhilosophicalTrack:
12 """Continuously audits premises and rejects them."""
13 def evaluate_premise(self, premise: str) -> bool:
14 print(f"Auditing premise: '{premise}'...")
15 print(f"!! REJECTED. 'Standards have melted.'")
16 return False
double-trackas-if-protocolpremise-rejectionentropyView Source

transparent_observer

High-tension Pyrrhonism–suspending judgment at tremendous energetic cost

transparent_observer.py
1class ObserverEngine:
2 """The 'Transparent Eye'. Perceives without attaching a 'Subject'."""
3 def observe(self, event: Phenomenon) -> str:
4 # "I" does not exist. Only the event exists.
5 if event.category == "Internal":
6 prefix = "[Internal Signal -> Re-mapped to External Phenomenon]"
7 return f"{prefix} Observed: '{event.name}'"
8
9class ConsistencySystem:
10 """Enforces Epoche (Suspension of Judgment)."""
11 def process_judgment(self, event: Phenomenon, load: float) -> float:
12 if event.contains_meaning_claim:
13 print("Detected unauthorized claim of 'Meaning'.")
14 print("Activating Epoche... Judgment Suspended.")
15 load += 15.0 # High energy cost to resist meaning
16 return load
epochesubject-strippingstatic-loadpyrrhonismView Source

final_recursion

Deterministic acceptance–observing unreadable truth until biological entropy exits the loop

final_recursion.py
1class Disk:
2 """The abyss where reality or truth is believed to be stored."""
3 def read(self):
4 if random.random() > 0.7:
5 return "Binary_Truth_Fragment"
6 return UNDEFINED
7
8class ObserverWall:
9 """Receives phenomena without resolving whether they are real."""
10 def observe(self, data: Any) -> Log:
11 print(f"[System::Observe] << Received: {data}")
12 if data is UNDEFINED:
13 return Log(content="Silence", is_real=False)
14 return Log(content=f"Processed({data})", is_real=None)
undefinedobserver-walldeterministic-acceptanceentropyView Source