Skip to content

ear trainer and tools for playing and programming music and audio 🎢🦜

License

Notifications You must be signed in to change notification settings

ryanatkn/earbetter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

earbetter

two beamed musical notes with ears

ear trainer and tools for playing and programming music and audio 🎢🦜 earbetter.ryanatkn.com

play at earbetter.ryanatkn.com

Feedback is super welcome, please open any discussions or issues. For more see contributing.md.

usage

npm i -D @ryanatkn/earbetter
import Piano from '@ryanatkn/earbetter/Piano.svelte';

Earbetter is made with Signals from @preactjs as the main store library. It works well but I have mixed feelings. I haven't used the library again, and I'm not sure if I will. This issue is a blocker. It does make code concise.

No docs yet, for now see the modules referenced in package.json.

intro

In 2016 I made a simple ear trainer named Ear Sharpener because I thought ear training was interesting, but it wasn't a good training tool. The goal of Earbetter is to be a useful and customizable ear trainer. I also want it to be fun so it motivates more training, but it's not there yet.

I'm not a musician and I'm one person so I can't possibly make all of the best ear training challenges. Knowing this, I designed the software so you can create and share custom challenges - the content is all configurable.

Earbetter's trainer has "levels" broken up into "trials". Each trial is a sequence of notes that you hear and then play back. Your score for the level is the sum of mistakes made in each trial, and you'll get a β˜… when you reach 0 across four runs of the level.

When a sequence is two notes long, it trains individual intervals, and longer sequences train a combination of relative pitch and working memory.

It's limited but supports a decent range of ear training challenges and there's room to add more capabilities. (if you have ideas please share!) In the level creator, you can click the "import" button to get copy-pastable data as text that you can share with others.

"Realms" group multiple levels together, and each realm may have a particular flavor like a scale. Realms can be created and shared just like importing/exporting levels.

"Projects" are like save files. They group multiple realms together. They can similarly be imported/exported.

In the future I'll probably add a way to share in-app, but that requires some kind of server infrastructure. For now I'm accepting content submissions in this repo, so we get the benefit having a lot of static content without needing a server. I'm open to input but I'm hesitant to operate any kind of service or add non-static dependencies -- for now, you're invited to open PRs with your exported data following the default example, or email me if you don't use GitHub.

For more please see contributing.md and the GitHub discussions and issues.

develop

This project uses SvelteKit with the static adapter and Vite, so the normal commands like vite dev work as expected. I use gro for additional things like deploying - see below for more.

Windows is not yet supported (we recommend WSL)

gro dev # npm i -g @feltjs/gro

See SvelteKit, Vite, Svelte, Fuz, and Gro for more.

build

gro build

See Gro's build docs for more.

test

gro test

See uvu and Gro's test docs.

deploy

Deploy (build, commit, and push) to the deploy branch, e.g. for GitHub Pages:

gro deploy

To configure GitHub pages (which this repo uses) or another static host, customize or delete src/static/CNAME.

credits 🐒🐒🐒

TypeScript βˆ™ Svelte βˆ™ SvelteKit βˆ™ Vite βˆ™ esbuild βˆ™ Fuz βˆ™ Gro βˆ™ uvu βˆ™ ESLint βˆ™ Prettier & more

license 🐦

public domain ⚘ The Unlicense