{"id":18590412,"url":"https://github.com/dimitrioslisenko/fet","last_synced_at":"2025-10-12T22:43:19.254Z","repository":{"id":45363913,"uuid":"199087417","full_name":"DimitriosLisenko/fet","owner":"DimitriosLisenko","description":"A Functional Ear Trainer!","archived":false,"fork":false,"pushed_at":"2024-05-16T20:17:39.000Z","size":1305,"stargazers_count":4,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-09T18:59:13.639Z","etag":null,"topics":["ear-training","midi","music"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DimitriosLisenko.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-26T22:31:28.000Z","updated_at":"2025-03-10T11:19:13.000Z","dependencies_parsed_at":"2024-11-07T00:55:21.240Z","dependency_job_id":null,"html_url":"https://github.com/DimitriosLisenko/fet","commit_stats":{"total_commits":338,"total_committers":3,"mean_commits":"112.66666666666667","dds":"0.10355029585798814","last_synced_commit":"f494cb4b1e6c01c201322491e920ce2230119e90"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitriosLisenko%2Ffet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitriosLisenko%2Ffet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitriosLisenko%2Ffet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DimitriosLisenko%2Ffet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DimitriosLisenko","download_url":"https://codeload.github.com/DimitriosLisenko/fet/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248243452,"owners_count":21071054,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ear-training","midi","music"],"created_at":"2024-11-07T00:55:16.379Z","updated_at":"2025-10-12T22:43:14.205Z","avatar_url":"https://github.com/DimitriosLisenko.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![codecov](https://codecov.io/gh/DimitriosLisenko/fet/branch/master/graph/badge.svg?token=6W2B0Z4E4S)](https://codecov.io/gh/DimitriosLisenko/fet)\n\n# FET (Functional Ear Trainer)\nThis is a functional ear trainer, meaning that it teaches you to identify degrees in a key.\n\nEvery level, a chord progression is played to identify a major/minor key, followed by random notes played harmonically. The degrees of these notes should be identified and selected.\n\n\u003cimg src=\"./assets/readme/demo.gif\"\u003e\n\n## Installation\n### Prerequisites\nInstall TiMidity++ for required performance improvements when converting MIDI to other formats.\n#### OS X\n```sh\nbrew install timidity\n```\n#### Ubuntu\n```sh\napt install timidity\n```\n\n### Gem\nAdd this line to your application's Gemfile:\n\n```ruby\ngem 'fet'\n```\n\nAnd then execute:\n\n    $ bundle install\n\nOr install it yourself as:\n\n    $ gem install fet\n\n## Usage\n\n### Ear Training via the UI\nThe UI currently supports listening exercises, where a chord progression is played to establish a key, followed by notes played harmonically. The degrees of these notes should be identified by selecting them in the UI.\n\nThe binary can be executed as follows:\n```sh\nfet play listening --degrees 1 --key-type major --next-on-correct --tempo 200 --limit-degrees b6 --limit-degrees 5\n```\n\nAll flags are optional, and serve the following purposes:\n\n| Flag | Description |\n| ------------- | ------------- |\n| --degrees | How many unique degrees to play for the random notes - maximum of 11. |\n| --key-type | Type of key to play, can be \"major\" or \"minor\". |\n| --[no-]next-on-correct | Go to the next level automatically when answered correctly. |\n| --tempo | The tempo at which the chord progression is played. |\n| --limit-degrees | Limit to specific degrees. Can be supplied multiple times. |\n\nWhen using the UI, the following keyboard shortcuts are defined to allow for mouse-free interaction:\n| Keyboard Shortcut | Description |\n| ------------- | ------------- |\n| ENTER | Go to the next level once this level is over. |\n| q | Quit the application. |\n| c | Repeat the chord progression only. |\n| n | Repeat the notes only. |\n| l | Repeat the question (looping). |\n| 1-7 | Select the degree, e.g. \"2\" selects the 2nd degree. Will also play that degree once the level is over. |\n| - | Modify the above degree to flatten it, e.g. \"-\" followed by \"2\" will select the b2nd degree. |\n| + | Modify the above degree to sharpen it, e.g. \"+\" followed by \"4\" will select the #4th degree. |\n| 0 | Make the degree natural, e.g. \"+\" followed by followed by \"0\" followed by \"4\" will select the 4th degree. |\n\n### Ear Training via MIDI files\n#### Filename Format\nThe generators will currently create MIDI files. The correct answer is included in the filename.\n\n#### Listening exercises\nFor listening exercises, here is a potential list of generated MIDI files (for 2 degrees):\n```sh\n$ find .\n...\n./listening/major/DbM_b6(Bbb2)_5(Ab5).mid\n./listening/major/BbM_7(A4)_2(C6).mid\n./listening/major/EM_b6(C2)_3(G#2).mid\n./listening/major/GbM_6(Eb4)_3(Bb5).mid\n./listening/major/FM_6(D4)_3(A5).mid\n...\n./listening/minor/Dm_b7(C3)_1(D4).mid\n./listening/minor/F#m_b2(G2)_3(A#4).mid\n./listening/minor/G#m_b6(E1)_b2(A2).mid\n./listening/minor/Dm_6(B0)_7(C#3).mid\n./listening/minor/C#m_5(G#4)_6(A#4).mid\n...\n```\nThe file name contains all the information required for the answer. For example, `EM_b6(C2)_3(G#2).mid`:\n\n`EM`: the chord progression is in E Major.\n\n`b6`: the bottom note will be the b6 degree\n\n`(C2)`: the [scientific pitch notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation) of which is C2\n\n`3`: the next note from the bottom will be the 3 degree\n\n`(G#2)`: the [scientific pitch notation](https://en.wikipedia.org/wiki/Scientific_pitch_notation) of which is G#2\n\n#### Singing exercises\nThe singing exercises will generate all possible combinations for keys and degrees as follows:\n```sh\n$ find .\n...\n./singing/major/AM_1.mid\n./singing/major/BbM_3.mid\n./singing/major/CM_4.mid\n./singing/major/CM_5.mid\n./singing/major/BbM_2.mid\n...\n./singing/minor/Am_1.mid\n./singing/minor/Bbm_3.mid\n./singing/minor/Cm_4.mid\n./singing/minor/G#m_4.mid\n./singing/minor/F#m_1.mid\n...\n```\nThe file name contains all the information required for the answer. For example, `BbM_3.mid`:\n\n`BbM`: the chord progression is in Bb Major.\n\n`3`: you should sing the 3rd degree.\n\n#### Single Note Listening exercises\nFor single note listening exercises, the same note is played across all possible keys:\n```sh\n$ find .\n...\n./listening_single_note/major/CM_1.mid\n./listening_single_note/major/BM_b2.mid\n./listening_single_note/major/F#M_b5.mid\n...\n./listening_single_note/minor/Am_b3.mid\n./listening_single_note/minor/G#m_3.mid\n./listening_single_note/minor/Cm_1.mid\n...\n```\nThe file name contains all the information required for the answer. For example, `G#m_3.mid`:\n\n`G#m`: the chord progression is in G# Minor.\n\n`3`: the note that is played is the 3rd degree in this key.\n\n### More Information\nRefer to [the rdoc](https://github.com/DimitriosLisenko/fet/blob/master/fet.rdoc) for detailed usage instructions and descriptions of commands.\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/DimitriosLisenko/fet.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimitrioslisenko%2Ffet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdimitrioslisenko%2Ffet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdimitrioslisenko%2Ffet/lists"}