Commit graph

15150 commits

Author SHA1 Message Date
William Carroll
f55d2f09f7 Remove duplicate step from README
I mention setting tempo twice... whoops.
2020-04-18 19:50:12 +01:00
William Carroll
6dc48753f5 Prefer "Tap" to "Press"
I'm preferring the verb "tap" to "press".
2020-04-18 19:49:25 +01:00
William Carroll
82ebc0ad19 Debug unresponsive button press for selectKey
Observed problem: Tapping "C major, A minor" key, which LPC sets by default,
does not unset it.

Bug: handleClick passed the relativeMinor Key but the default value in
State.Model is the C Major key. We would toggled b/w [Cmajor] ->
[Cmajor,Aminor], and because toggled checked if either Cmajor or Aminor was
present, it was always true.

Solution: Check relativeMajor to set toggled.
2020-04-18 18:51:23 +01:00
Vincent Ambo
590e1e1048 feat(tools/emacs): Add screen layouts for nugget to EXWM config 2020-04-18 15:27:56 +01:00
William Carroll
441fe3e32e Tidy app
Now that I have a deployed an MVP of my app, I am tidying things up to support
the next phase of development.

TL;DR:
- Moved application Model-related code into State module
- Moved each View into its own module
- Deleted unused ChordInspector component
- Deleted unused Msg's, {Increase,Decrease}Tempo
- Deleted misc unused code
2020-04-18 14:58:16 +01:00
William Carroll
ddbd7e2ef5 Ignore Main.min.js
The elm2nix expression builds my code as Main.min.js. As such, I changed my
index.html to require Main.min.js instead of elm.js. When I run elm-live now, I
make sure that I output Main.min.js as well. I need to gitignore this to exclude
it from my repository though.
2020-04-18 14:26:28 +01:00
William Carroll
720d727d64 Orient "Press to practice" button
Rotate the "Press to practice" copy to ensure that it is readable in landscape
mode.
2020-04-18 14:24:41 +01:00
William Carroll
f0803547e4 "Chord Drill Sergeant" -> "Learn Piano Chords"
In the spirit of "keep it simple, stupid", I am naming this application as
closely to the functionality as I can imagine.
2020-04-18 13:30:38 +01:00
William Carroll
39d084e493 Use elm2nix to (attempt to) deploy learnpianochords.app
After a few failed attempts at deploying my Elm application on NixOS, I'm trying
elm2nix, which some NixOS and Elm users created to attempt to solve some of the
issues that I ran into earlier today.

Elm tries to write to $HOME, which NixOS doesn't like. I typically prefer to
avoid things like cabal2nix, elm2nix, node2nix because I don't like the workflow
that they suggest, but I'm so eager to deploy this application, that I'm trying
it.
2020-04-18 00:10:39 +01:00
Abseil Team
b35973e3e3 Export of internal Abseil changes
--
d857e6e1f9b09a3eb5abd890677a98b23346f07a by Abseil Team <absl-team@google.com>:

Simplify internal TryAcquireWithSpinning.

No point declaring the `result` variable: we can just return the results
directly.

PiperOrigin-RevId: 307045800

--
421952252bc23be51f47f7d23f3422bad1ed382c by Derek Mauro <dmauro@google.com>:

Add custom sink support for `absl::Format()` through an ADL extension mechanism.

Users can now define
`void AbslFormatFlush(MySink* dest, absl::string_view part)`
to allow `absl::Format()` to append to a custom sink.

PiperOrigin-RevId: 306929052

--
c73d5cdb62cd58ea421ed1aeeab78a0ffcfeeefb by Matt Calabrese <calabrese@google.com>:

Internal-only conformance-testing macro ABSL_INTERNAL_ASSERT_CONFORMANCE_OF for compile-time and runtime checks of a specified type, expected properties of that type, and a logically-ordered series of equivalence classes of that type.

PiperOrigin-RevId: 306885512

--
a8c2495a07f37d68907855e3f0535bd5c27a3b52 by Abseil Team <absl-team@google.com>:

Internal change

PiperOrigin-RevId: 306766753
GitOrigin-RevId: d857e6e1f9b09a3eb5abd890677a98b23346f07a
Change-Id: Ic23c92ac74f9ffcbb2471ff8c6691f4b7b20354b
2020-04-17 11:58:29 -04:00
William Carroll
277ad983d4 Nixify build for Chord Drill Sergeant
Thankfully @tazjin builds Gemma (an Elm project) with Nix, so I could reference
Gemma's default.nix to help me with mine. Elm problematically attempts to
HTTP-fetch a list of packages to verify my project's dependencies. Because Nix
builds derivations in a sandbox without network access, I need to use some
escape hatches (i.e. NIX_REDIRECTS, LD_PRELOAD,
SYSTEM_CERTIFICATE_PATH). Welp... it's packaged now...

I'm also pointing learnpianochords.app to this project's index.html. It will be
live soon! :)

TODO(wpcarro): Rename "Chord Drill Sergeant" -> "Learn Piano Chords" (KISS)
2020-04-17 15:08:38 +01:00
William Carroll
bdb16c11ba Simplify preferences
I'd like to deploy an MVP version of this application today, so I'm dropping
support for a few features to focus my efforts. I may bring these features
back.

TL;DR:
- Temporarily drop support for "Fine Tune" tab of preferences
- Sort keys by the Circle of Fifths
2020-04-17 13:35:33 +01:00
William Carroll
5ca0fa2fcd Render a mobile-friendly piano
For now since I'm the only customer and I'm primarily making this for myself,
I'm styling the app specifically for my Google Pixel 4. If I find this app
useful, I will consider supporting other devices.

I'm using the Icons that I bought when I purchased the "Refactoring UI" book.

Other news:
- I bought the domain learnpianochords.app!

What's left:
- Style the "fine tune" tab of the preferences view
- Better support non-mobile devices like the browser and tablet devices
- Deploy the application to learnpianochords.app
- Redesign the "key" tab of the preferences view to sort the keys according to
  the circle of fifths
- Dogfood
- Simplify until I cannot simplify anymore
2020-04-17 13:35:29 +01:00
Vincent Ambo
820b1bb0c9 feat(tools/emacs): Refactor monitor layout setup in EXWM
vauxhall (my laptop) now has an additional screen connected at home,
but sometimes I use that screen for my desktop computer (nugget).

This refactors the randr configuration for EXWM to support somewhat
more dynamic, multi-monitor layouts and adds key bindings to toggle
between some of the different configurations I want.
2020-04-17 13:13:59 +01:00
Vincent Ambo
066d34b50e feat(ops/nixos/nugget): Add chromium with VAAPI patches
These patches enable hardware-accelerated video decoding, which is
useful for Stadia.

The main issue with this is that Hydra doesn't currently cache
Chromium with these patches, which means that it is built from scratch
which takes in the order of 5 hours on an otherwise unused nugget.
2020-04-17 12:43:25 +01:00
Abseil Team
db5773a721 Export of internal Abseil changes
--
0e867881e4b9f388a13d6fa8ed715192460130ab by Abseil Team <absl-team@google.com>:

Minor wording change to header comment for Mutex::AwaitWithDeadline(). No functional changes.

PiperOrigin-RevId: 306729491

--
fc64361fb831003fa5e6fbb84a9a89338fd2838c by Derek Mauro <dmauro@google.com>:

Uses C++20 compatible allocator traits in Abseil types

This merges both instances of CountingAllocator in the Abseil codebase.
Makes the presubmits test C++20 mode.

Fixes #651

PiperOrigin-RevId: 306728102

--
d759e5681b9dd6b7339fc019ed58fb5fdececdc3 by Derek Mauro <dmauro@google.com>:

Makes btree's iterator comparisons C++20 compatible

See https://stackoverflow.com/questions/60386792/c20-comparison-warning-about-ambiguous-reversed-operator

PiperOrigin-RevId: 306702048

--
e9da5f409bc5ddb1bad308f9d8c41213c67a1d1e by Derek Mauro <dmauro@google.com>:

Switch a few uses of at() that should have been data() in the implementation of InlinedVector.
Use ABSL_HARDENING_ASSERT in resize().

PiperOrigin-RevId: 306670992
GitOrigin-RevId: 0e867881e4b9f388a13d6fa8ed715192460130ab
Change-Id: If431f3e5d77097e9901654773552dcc01dface87
2020-04-16 11:33:32 -04:00
Daniel Høyer Iversen
2f1ac5c9d3
0.13.1 2020-04-16 17:01:30 +02:00
Abseil Team
71079e42cb Export of internal Abseil changes
--
2182f6d50e2bcb77858aaab6001ebffdc13bee89 by Derek Mauro <dmauro@google.com>:

Use base_internal::AtomicHook instead of std::atomic for
StatusPayloadPrinter

Imports #661

PiperOrigin-RevId: 306514102

--
6f8047057f4530c17c06ab1737a1937c86402807 by Mark Barolak <mbar@google.com>:

Fix ABSL_RANDOM_RANDEN_COPTS setting on FreeBSD

Import of https://github.com/abseil/abseil-cpp/pull/664

PiperOrigin-RevId: 306485774

--
cb3b73b9607d0009bbcfd7766f4f1fa4fde9c8b9 by Abseil Team <absl-team@google.com>:

Avoid a -Wimplicit-int-float-conversion warning.

Without this explicit cast, this code produces a warning of "implicit conversion from 'const int64_t' (aka 'const long') to 'double' may lose precision" when this warning is turned on.

PiperOrigin-RevId: 306358838

--
ef895ea6b28c96b64531c218705bac9c3fa169d5 by Greg Falcon <gfalcon@google.com>:

Internal change

PiperOrigin-RevId: 306040909
GitOrigin-RevId: 2182f6d50e2bcb77858aaab6001ebffdc13bee89
Change-Id: I69555c1722745a74c1603c62a621ca765d253fe5
2020-04-15 13:29:54 -04:00
Felipe Martins Diel
548aa05da0
Extend support to RM4 Pro (0x6026) (#340) 2020-04-15 09:04:01 +02:00
Adrián Medraño Calvo
007916c647 Fix window manager name
* exwm.el (exwm--init-icccm-ewmh): Correct _NET_WM_NAME to the
	name of the window manager on the _NET_SUPPORTING_WM_CHECK.
2020-04-15 00:00:00 +00:00
Adrián Medraño Calvo
373eda99bd Stop aborting recursive edit upon switching workspaces.
* exwm-workspace.el (exwm-workspace-switch): Stop aborting
	recursive edit upon switching workspaces.  Users should handle it
	just like in regular Emacs (possibly customizing
	`enable-recursive-minibuffers').
2020-04-15 00:00:00 +00:00
Adrián Medraño Calvo
cddb3429d2 Abort recursive edit before switching workspaces
* exwm-workspace.el (exwm-workspace-switch): Abort recursive edit
	before switching to other workspace.  This avoids the usual
	`set-window-configuration' calls (e.g., by `eval-expression') to
	switch *us back to the previous workspace.
2020-04-15 00:00:00 +00:00
Pavel Samolysov
2946ac0dea
Use base_internal::AtomicHook instead of std::atomic (#661)
* Use base_internal::AtomicHook instead of std::atomic

std::atomic has a broken implementation on the Windows platform and it
is not conform to the ABSL_CONST_INIT macro when clang-cl is used as a
compiler: the macro is expanded to the [[clang::require_constant_initialization]]
attribute and the attribute cannot be applied to the broken std::atomic.

Therefore, std::atomic has been replaced with absl::base_internal::AtomicHook
to fix the compilation error (thank Derek Mauro for the suggestion).

Issue: #659

Signed-off-by: Pavel Samolysov <samolisov@gmail.com>

* Update build files for pull request

Co-authored-by: Derek Mauro <dmauro@google.com>
2020-04-14 17:25:55 -04:00
Po-Chuan Hsieh
567bee2f73
Fix ABSL_RANDOM_RANDEN_COPTS setting on FreeBSD (#664)
* Fix build on FreeBSD

On FreeBSD amd64, both uname -p and uname -m returns amd64 (lowercase).
It seems Windows returns AMD64 (uppercase).

Reference:
[1] https://cmake.org/cmake/help/latest/variable/CMAKE_SYSTEM_PROCESSOR.html
[2] https://cmake.org/cmake/help/latest/variable/CMAKE_HOST_SYSTEM_PROCESSOR.html

* Use MATCHES for multiple values
2020-04-14 12:14:44 -04:00
Matthew Garrett
af99f92721
Merge pull request #339 from felipediel/patch-3
Fix padding algorithm for CBC mode
2020-04-13 17:40:48 -07:00
William Carroll
1d427c4921 Begin styling efforts
Start styling the Chord Drill Sergeant for mobile devices because that is that
device on which I will primarily use CDS.

I'm also deleting the debugger related code. I would like to support a debugger,
but I'm not currently using this one, so I am going to remove it to keep things
slender.

- Introduce TailwindCSS, which also introduced elm-live, index.html, index.css
- Add mobile-first styling for the preferences modal
- Remove unused code
2020-04-13 22:43:04 +01:00
Felipe Martins Diel
a5925063f9
Fix padding algorithm for CBC mode
Due to the lack of a parenthesis, the packets were getting 16 bytes larger than necessary.
2020-04-13 17:42:51 -03:00
William Carroll
a64601cc05 Support generating chords for a particular key
Generate chords for a given key.

I believe my Theory.allChords function is taking a long time to generate all of
the chord possibilities. I would like to profile this to verify this
assumption. I think I can create a "staging area" for changes and only
regenerate chords when "committing" the options from the "staging area". This
should stress the application less.

TODO: Profile application to find bottleneck.
2020-04-13 15:46:26 +01:00
William Carroll
6a3af6c9c6 Don't render the notes on the piano
I was using this to debug a feature that I no longer need to debug.
2020-04-13 15:06:35 +01:00
William Carroll
774c0ddf05 Rename NoteClass -> PitchClass
For the past two to three days, I've been searching for the name for the concept
of "C" or "A". From what I read, notes are specific things like C0 or C4, but I
wanted the name of the concept of a C. Thankfully today I discovered that this
is called a pitch class.
2020-04-13 10:02:03 +01:00
William Carroll
edc8f4ef6e Remodel model.selectedChord as Maybe Chord
Until the user presses play, we shouldn't display any chords.
2020-04-13 09:42:26 +01:00
William Carroll
6a91065677 Whitelist and blacklist note classes
Often I want to practice only C, F, and G-chords in all inversions. Next I'd
like to only support the chords for various keys.
2020-04-12 23:35:16 +01:00
William Carroll
083763f7f2 Only display chords that fit on the displayed piano
Only show the chords that we can fit on the piano.

TODO: Debug occasional instance where we render chords that do not fit. I am
unsure how to reproduce these states at the moment.
2020-04-12 23:33:56 +01:00
William Carroll
3ee1b1f670 Support suspended chords
I'm not sure how valuable it is to study all of the inversions of the suspended
chords. Maybe it is. I'll let the users decide.
2020-04-12 23:32:00 +01:00
William Carroll
bf460fe5ac Whitelist and blacklist chordTypes
Allow and disallow chords by the type of chords.
2020-04-12 19:32:54 +01:00
William Carroll
1298263629 Whitelist and blacklist chords by inversion type
Add checkboxes to support various chord positions.
2020-04-12 19:20:00 +01:00
William Carroll
24692ab465 Properly support chord inversions
While I did change a lot of functionality, I also ran `elm-format` across the
codebase, which makes these changes a bit noisy.

Here is the TL;DR:
- Properly support chord inversions
- Ensure that the piano styling changes dynamically when I change the variables
  like `naturalWidth`
- Add start and end notes to define the size of the piano and which chords we
  create
- Support elm-format and run it across entire project
- Debug Misc.comesBefore
- Introduce a ChordInspector and debugger

TODO: Ensure that we only generate chords where all of the notes can be rendered
on the displayed keys.

TODO: Add preferences panel, so that I can do things like "Practice blues chords
in C and E with chord substitutions."
2020-04-12 16:43:34 +01:00
William Carroll
730aecc076 Support NoteClass
Remodel application to support the scientific pitch notation for notes. Instead
of supporting simply "C", support "C4". This change created cascading
changes. After refactoring for around an hour, I restored the app to a working
state. The current state is not desirable, but it compiles. More changes on the
way.
2020-04-11 23:11:04 +01:00
William Carroll
808e6ee484 Support Misc module
Define two functions for attempting to return an element in a list that precedes
or succeeds another element.

I prefer having something like Utils.List. Perhaps I will refactor.
2020-04-11 23:10:14 +01:00
William Carroll
c24c9b7fb9 Support BPM for tempo
Using BPM as the unit for tempo.

TODO: Consider a higher-fidelity way to calculate BPM, although I'm not sure
this is critical functionality; an interesting problem is just seducing me, and
this app would be better off resisting the temptation.
2020-04-11 17:46:46 +01:00
William Carroll
e864074600 Support elm-mode for Emacs
Instead of (ab)using haskell-mode, support elm-mode.

TODO: Support elm-format on buffer save
2020-04-11 17:45:59 +01:00
William Carroll
93bdebf9b2 Track app ideas
Use an org file to track random ideas or features or improvements.
2020-04-11 17:44:20 +01:00
William Carroll
3c8bfe85c9 Prefer type alias to type
Elm reminds me of Haskell. In fact, I'm using `haskell-mode` (for now) in Emacs
to write my Elm code, and it works reliably. I'm not writing a Haskell app, but
if I were, I would define my application Model with the following Haskell code:

```haskell
data Model = Model { whitelistedChords :: [Theory.Chord]
                   , selectedChord :: Theory.Chord
                   , isPaused :: Bool
                   , tempo :: Int
                   }
```

When I first modelled my application state, I did something similar. After
reading more Elm examples of SPAs, I see that people prefer using type aliases
to define records. As far as I know, you cannot do this in Haskell; I believe
all types are "tagged" (something about "nominal typing" comes to mind). Anyhow,
Elm isn't Haskell; Haskell has cool features like type classes; Elm has cool
features like human-readable error messages and exhaustiveness checking for
cases. I love Haskell, and I love Elm, and you didn't ask.

Anyhow, this commit refactors my records as type aliases instead of types. I
think the resulting code is more readable and ergonomic.
2020-04-11 16:50:02 +01:00
William Carroll
52eb456a0f Support basic tempo
Supporting Play/Pause events, and Increase/Decrease tempo.

TODO: Convert milliseconds to BPM
2020-04-11 16:09:11 +01:00
Vincent Ambo
b4bf0b37b0 chore(ops/nixos/nugget): Install steam again 2020-04-11 13:31:17 +01:00
Abseil Team
bf6166a635 Export of internal Abseil changes
--
1eb20c4802ccaa316ecebc237877210b77ac84f7 by Abseil Team <absl-team@google.com>:

Use constraint_values to detect windows.

This resolves ambiguous copts when cross compiling with LLVM on Windows.

PiperOrigin-RevId: 305935379

--
47c96948132a577b14642ad4c910052768c41d62 by Abseil Team <absl-team@google.com>:

Add StrSplit conversion tests for the swisstable containers.

PiperOrigin-RevId: 305747160

--
0daea0f78b50d49520bd6e67d093cd87d057bb86 by Abseil Team <absl-team@google.com>:

Typo fix: Removes duplicate word.

PiperOrigin-RevId: 305502962
GitOrigin-RevId: 1eb20c4802ccaa316ecebc237877210b77ac84f7
Change-Id: I1bfa0beda0260027a22bc671344cc8b74315b77a
2020-04-11 06:40:20 -04:00
William Carroll
2f446d0441 Improve the styling of the piano
Create a more convincing representation of the piano.

I would like to compute the left-offset based on the naturalWidth. That change
is probably forthcoming.
2020-04-11 11:36:37 +01:00
William Carroll
3562343c19 Generate all known chords and display randomly selected chords
First of all, Elm's purity is beautiful. I think every language should model
their error messages and develop experience after Elm. If I didn't have to
download packages, I don't think I would need an internet connection to
troubleshoot my program's errors. This is how helpful I find the compiler.

Now that that's out of the way, here's what I've changed since we've last
corresponded:
- Use Elm's Browser.element to create a reactive application with state
- Write a function to generate all of the chords about which CDS knows
- Move some code out of Main.elm into other modules
- Depend on List.Extra, Random, Random.Extra

What's left:
- Lots of work
- Instead of clicking a button to show a new chord, use a timer
- Add mobile-first styling (probably add TailwindCSS)
- Persist settings in LocalStorage (and then eventually create user accounts)
- Allow users to curate the list of chords they're interested in practicing
- Deploy the website and dogfood it

Unknowns:
- How can I handle tempo? I don't expect setInterval to be enough (maybe it
  is)...
2020-04-11 10:45:42 +01:00
William Carroll
3dac2f10ff Drop support for Haskell glyphs
I think that glyphs look nice, but they subtley confuse Emacs's UI. In the case
of a two-character glyph condensing into one character's width, the fill-width
indicator -- correctly -- highlights the 81st character as red, but it looks
like it's erroneously highlighting the 80th.

Also when I want to create an anonymous function I type (), which condenses into
the unit character, and it's difficult to delete either the opening or the
closing parenthesis.

Overall I think glyphs are cute, but they're not worth the trouble.
2020-04-11 10:41:49 +01:00
William Carroll
b600f709b4 Model data and sketch ideas for Chord Drill Sergeant
Initialize an Elm application to build a MVP for the Chord Drill Sergeant
application. There isn't much to see at the moment. I'm just sketching
ideas. More forthcoming...
2020-04-10 23:03:01 +01:00