Giter Club home page Giter Club logo

muscala's Introduction

Kevin Hui

Hi there! I'm a recent graduate from Northeastern University majoring in Computer Science and minoring in Mathematics. I specialize in back-end and infrastructure work (scaling is a fun problem!), but I also enjoy a whole array of other fields (such as learning about computer security and computer architecture!).

Check out some of my pinned repositories for the stuff I'm currently working on!

CV

Check out the places I've worked at!

2022

  • Jan 2022: Incoming Software Engineer at Facebook Meta

2021

  • Sep 2021 - Dec 2021: Lead Teaching Assistant for Khoury College's CS 1210 course (Professional Development for Co-op)
  • May 2021 - Jul 2021: Software Engineering Intern at Amazon
  • Jan 2021 - Mar 2021: Software Engineering Intern at Facebook

2020

  • Sep 2020 - Dec 2020: Teaching Assistant for Khoury College's CS 1210 course (Professional Development for Co-op)
  • May 2020 - Aug 2020: Software Engineering Intern at Microsoft
  • May 2020 - Jul 2020: Teaching Assistant for Khoury College's CS 3000 course (Algorithms)
  • Jan 2020 - Mar 2020: Software Engineering Intern at Honey

2019

2018

  • Sep 2018 - Dec 2018: Teaching Assistant for Khoury College's CS 3500 course (Object Oriented Design)
  • Jun 2018 - Aug 2018: Systems Engineering Intern at MITRE
  • Apr 2018 - Jun 2018: Teaching Assistant for Khoury College's CS 2800 course (Logic & Computation)

muscala's People

Contributors

cookiecomputing avatar

Watchers

 avatar  avatar

muscala's Issues

Travis CI not working

It seems that Travis CI is failing to download the binary needed to test. This means that any tests via Travis will automatically fail. We should check back on this when it seems that people are encountering issues.

Some people have found issues, like this one. It seems that the build is failing for releases past 1.4.9.

Add note generator for safe accidentals

We need to have a note generator that generates letters and a single type of accidental for scales, keys, and chords.

Currently, we use this pattern:

val minorPentatonicScaleGen: Gen[MinorPentatonicScale] = for {
    letter <- NoteTest.noteLetterGen
    numOfAccidentals <- Gen.chooseNum(0, 1000)
    accidental <- NoteTest.accidentalGen
  } yield (...)

which can be refactored into a generator that does this for us

Add type classes in the library

One interesting feature that can be added to this project is the separation of data and functionality. As this post explains, type classes are a great way to do that. Since this project is a hybrid of learning music theory while also incorporating Scala/FP related concepts, I think it would be a great idea to consider migrating some classes into type classes to understand the concept

[Note] Brainstorm various ways of correcting the name for intervals

One interesting thought I had about the intervals:

When we use MajorInterval(Note("C").get).third, we expect Note("C####").get. We obviously want to correct for this and make it an "E" if the user desires to do so. However, this raises an interesting question: When should we do that? And how do we define correctness? Say we're in the key of "C##" (extreme edge case, but possible). How should be approach negating such a term?

How should other intervals like MinorInterval be used as well? Currently, we see MinorInterval as Note("C###").get if we were to use the previous example, but would it make sense instead to base it off of the MajorInterval?

Add keys

[x] Major keys
[ ] Minor keys
[ ] Code abstraction between major and minor keys

Parallelize testing code

This might be a little too ambitious now, but we're approaching a point where the property-based testing of the project is accumulating on the testing end. This has a notable hit on testing time when we increase the sample sizes as in 33759c5, but is not too large of an issue just yet. However, as the project scales and substantially more property tests are added to the project, it may be worth looking into parallelization to reduce the time spent waiting for a single test to run.

Example of how to parallelize tests

Add "chord guessing" functionality

One really cool feature I saw in mingus was the ability to "guess" a chord based on a list of tones. While this might something we implement as a huge feature later on, I wanted to jot it down so we have this issue tracked

Add measures, beats, rhythm

All the work up until now has been focused on harmony, which while necessary, does not fully convey everything expected of music. We should add measures, beats, and rhythm when given the chance

Add accidentals to some scale/key gens

Some of our scale and key generators only have a natural letter generator, but this does not account for other valid keys/scales. We should fix this and verify that property checks still pass.

Add seventh chords

While triads have been added, we did not add seventh chords. Those should be added

Migrate sevenths() from key to scales

Similar to #14, we should move this method out of the key itself and into a MajorScale and NaturalMinorScale class. This is currently in the key class to add additional sanity checks as properties of keys

Add non-tertian/extra seventh chords

The current seventh chords in the project only account for tertian seventh chords, which should capture many of the chords that we are concerned about for now.

One chord we could consider adding is the augmented augmented seventh chord, which is rarely used but is technically a chord.

Add WholeStep/HalfStep to remove magic numbers

There are a LOT of magic numbers floating around (particularly in property tests) that are just representing 1 and 2 for half and whole steps respectively. While somewhat understandable, it does ruin readability to a degree. We should add constants to ensure that these magic numbers are removed

Add option values to test cases

Currently, the tests for the project are basically littered with Option.get() calls because we know that the creation of an object will work, but there's no other way to access the actual object. We should refactor these calls to use OptionValues, as well as clean up some of our generators

Add modes

We should add modes to the project

Add scales

Some functionality in the Key class may be more suited towards being in some sort of Scale class instead. For instance, we have triads(), which are often reserved for scales as opposed to keys. We should create scales and migrate this functionality

Add extension chords

Extension chords may be a little more complicated, but basic extension chords like 9th, 11th, and 13th chords may be possible

Update apply logic for scales, keys, and chords

One pattern I come across this project is the following:

 def apply(tonic: String): Option[MajorPentatonicScale] =
    if (MajorScale(tonic).isDefined) Some(new MajorPentatonicScale(tonic))
    else None

This basically assumes that if I can build it with a major scale, then it must be valid. However, MajorScale must be constructed, which then constructs a MajorKey. This is a concern for latency, since this means we are constructing a key over and over, which can be an expensive operation if the key provided is outside of the circle of fifths.

We should change this so that we are just checking to see if it passes the key regex.

Add implicit conversions for Notes

A cool thought I had:

What if we were able to use implicit conversions to make some code look more elegant?

E.g., suppose we have the following:

"A#".distance("B".toNote)

as opposed to something like this:

Note("A#").get.distance(Note("B").get)

I think this would make the code look clearer to readers. We would have to define operations on Option[Note] to also remove the unnecessary .get operation, as well as to make it clear that we are not co-ercing a Option[Note] to Note all the time

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.