Giter Site home page Giter Site logo

sugarlabs / musicblocks Goto Github PK

View Code? Open in Web Editor NEW
522.0 35.0 720.0 215.67 MB

Music Blocks -- A musical microworld

Home Page: https://musicblocks.sugarlabs.org/

License: GNU Affero General Public License v3.0

CSS 4.75% HTML 9.31% JavaScript 84.75% ActionScript 0.73% Python 0.13% Sass 0.11% Less 0.22%
music-blocks education

musicblocks's Introduction

Music Blocks

All musicians are subconsciously mathematicians.” — Monk

Music is a hidden arithmetic exercise of the soul, which does not know that it is counting.” — Leibniz

Music Blocks is a Visual Programming Language and collection of manipulative tools for exploring musical and mathematical concepts in an integrative and fun way.

Getting Started

Music Blocks is an interactive Web Application — the interaction is done via basic mouse events like click, right click, click and drag, etc. and keyboard events like hotkey press. The application is audio-visual; it produces graphics artwork and music. Here are a couple of screenshots to give you an idea of how the application looks like:

alt tag

alt tag

Visit the Music Blocks website for a hands on experience: https://musicblocks.sugarlabs.org.

Or get Music Blocks from the Google Play Store

Some background on why we combine music and programming can be found here.

Refer to the following sections to get familiar with this application:

If you are a developer (beginner, experienced, or pro), you are very welcome to participate in the evolution of Music Blocks.

Refer to the following sections to get an idea:

Refer to the following for more information regarding the evolution of this project:

Running Music Blocks

Music Blocks is available under the GNU Affero General Public License (AGPL) v3.0, a free, copyleft license.

Music Blocks is designed to run in a web browser. The ideal way to run Music Blocks is to visit the URL musicblocks.sugarlabs.org in your browser — Google Chrome (or Chromium), Microsoft Edge (Chromium-based), Mozilla Firefox, and Opera work best.

To run from the latest master branch (experimental), visit sugarlabs.github.io/musicblocks.

How to set up a local server

Music Blocks is written using native browser technologies. The bulk of the functionality is in vanilla JavaScript. This means that most of the functionality can be accessed by launching the index.html file in the browser using file:///absolute/path/to/index.html.

However, using so, some functionality will not be available. On top of that, some web browsers (e.g., Firefox v68) have restrictions that prevent Music Blocks from running using file:///. Therefore, it is best to launch a local web server from the directory of Music Blocks.

  1. Download Music Blocks, or clone (https://github.com/sugarlabs/musicblocks.git for HTTPS, or gh repo clone sugarlabs/musicblocks for GitHub CLI), on your local machine.

  2. In a terminal, cd to the directory where you downloaded/cloned Music Blocks, using cd path/to/musicblocks/.

  3. If you do not have Python installed, you'll need to install it. You can test for Python in a terminal using python. Type exit() to exit Python. (Note that on some older Linux systems, the python3 command is not bound to python. You may need to perform a sudo apt install python-is-python3 on Debian-like distros, or equivalent on others.)

  4. After cloning the musicblocks repository, run

    for Linux and macOS:

    python -c "import os, sys; os.system('python -m SimpleHTTPServer 3000 --bind 127.0.0.1') if sys.version_info.major==2 else os.system('python -m http.server 3000 --bind 127.0.0.1')"

    for Windows:

    python -c "import os, sys; os.system('python -m SimpleHTTPServer 3000') if sys.version_info.major==2 else os.system('python -m http.server 3000 --bind 127.0.0.1')"

    If you have npm installed, simply run npm run serve for Linux and macOS, and npm run winserve for Windows.

    NOTE: Make sure you can run either python or py from your terminal, to launch the Python prompt.

  5. You should see a message Serving HTTP on 127.0.0.1 port 3000 (http://127.0.0.1:3000/) ... since the HTTP Server is set to start listening on port 3000.

  6. Open your favorite browser and visit localhost:3000 or 127.0.0.1:3000.

NOTE: Use ctrl + c or cmd + c to quit the HTTP Server to avoid socket.error:[Errno 48].

Local Setup with Docker

Prerequisites

Before you begin, ensure you have Docker installed on your machine. You can download and install Docker from the official Docker website.

Installation

  1. Clone the Music Blocks repository to your local machine:

    git clone https://github.com/sugarlabs/musicblocks.git
  2. Navigate to the cloned repository:

    cd musicblocks
  3. Build the Docker image using the provided Dockerfile:

    docker build -t musicblocks .

Running Music Blocks

  1. Run the Docker container using the built image:

    docker run -p 3000:3000 musicblocks

    This command will start a Docker container running Music Blocks and expose it on port 3000.

  2. Access Music Blocks in your web browser by navigating to http://localhost:3000.

Stopping the Docker container

To stop the Docker container, use Ctrl + C in your terminal. This will stop the container and free up the port it was using.

Additional Notes

  • Make sure to replace musicblocks with the appropriate image name if you have tagged the Docker image differently.
  • You can customize the port mapping (-p) if you prefer to use a different port for accessing Music Blocks.

This documentation provides a basic setup for running Music Blocks locally using Docker. Feel free to customize it further based on your specific requirements and environment.

Using Music Blocks

Once Music Blocks is running, you'll want suggestions on how to use it. Follow Using Music Blocks and Music Blocks Guide.

For Scratch and Snap users, you may want to look at Music Blocks for Snap Users.

Looking for a block? Find it in the Palette Tables.

Code of Conduct

The Music Blocks project adheres to the Sugar Labs Code of Conduct

Contributing

Please consider contributing to the project, with your ideas, your music, your lesson plans, your artwork, and your code.

Special Notes

Music Blocks is being built from the ground-up, to address several architectural problems with this run. Since Music Blocks is a fork of Turtle Blocks JS, musical functionality was added on top of it. However, music is fundamental to Music Blocks. Besides, the Turtle Blocks JS started initially with handful of features and was written without a complex architecture. As Music Blocks got built on top of that, it got incrementally complex, but the architecture remained simple, thus resulting in a monolith. Also, the functionality is tightly coupled with the interface and native client API (Web API).

Keeping these problems in mind, we have considered a foundational rebuild that will address all these issues, whilst adding buffers for future additions. We'll also be using a more elegant tech-stack to develop and maintain this project given its scale. After the core is built, we'll be porting features from this application to it.

Refer to the repository sugarlabs/musicblocks-2 for more information about the new project — Music Blocks 2.0.

Tech Stack

Music Blocks is a Web Application and is written using browser technologies — HTML, CSS (SCSS), JavaScript, SVG, etc.

If you're just getting started with development, you may refer to the following resources:

Programmers, please follow these general guidelines for contributions.

New Contributors

Use the discussions tab at the top of the repository to:

  • Ask questions you’re wondering about.
  • Share ideas.
  • Engage with other community members.

Feel free. But, please don't spam :p.

Keep in Mind

  1. Your contributions need not necessarily have to address any discovered issue. If you encounter any, feel free to add a fix through a PR, or create a new issue ticket.

  2. Use labels on your issues and PRs.

  3. Do not spam with lots of PRs with little changes.

  4. If you are addressing a bulk change, divide your commits across multiple PRs, and send them one at a time. The fewer the number of files addressed per PR, the better.

  5. Communicate effectively. Go straight to the point. You don't need to address anyone using 'sir'. Don't write unnecessary comments; don't be over-apologetic. There is no superiority hierarchy. Every single contribution is welcome, as long as it doesn't spam or distract the flow.

  6. Write useful, brief commit messages. Add commit descriptions if necessary. PR name should speak about what it is addressing and not the issue. In case a PR fixes an issue, use fixes #ticketno or closes #ticketno in the PR's comment. Briefly explain what your PR is doing.

  7. Always test your changes extensively before creating a PR. There's no sense in merging broken code. If a PR is a work in progress (WIP), convert it to draft. It'll let the maintainers know it isn't ready for merging.

  8. Read and revise the concepts about programming constructs you're dealing with. You must be clear about the behavior of the language or compiler/transpiler. See JavaScript docs.

  9. If you have a question, do a web search first. If you don't find any satisfactory answer, then ask it in a comment. If it is a general question about Music Blocks, please use the new discussions tab on top the the repository, or the Sugar-dev Devel <[email protected]> mailing list. Don't ask silly questions (unless you don't know it is silly ;p) before searching it on the web.

  10. Work on things that matter. Follow three milestones: Port Ready, Migration, and Future. Those tagged Port Ready are priority. Those tagged with Migration will be taken care of during or after the foundation rebuild. Feel free to participate in the conversation, adding valuable comments. Those tagged with Future need not be addressed presently.

Please note there is no need to ask permission to work on an issue. You should check for pull requests linked to an issue you are addressing; if there are none, then assume nobody has done anything. Begin to fix the problem, test, make your commits, push your commits, then make a pull request. Mention an issue number in the pull request, but not the commit message. These practices allow the competition of ideas (Sugar Labs is a meritocracy).

Modifying Music Blocks

The core functionality for Music Blocks resides in the js/ directory. Individual modules are described in more detail in js/README.md.

NOTE: As for any changes, please make a local copy by cloning this repository. Make your changes, test them, and only then make a pull request.

Contributing Code provides a general overview of Sugar Lab's guidelines. See Contributing section for specific details about this repository.

Reporting Bugs

Bugs can be reported in the issues tab of this repository.

If possible, please include the browser console log output, and steps to reproduce, when reporting bugs. To access the console, type Ctrl-Shift-J/F12 on most browsers. Alternately, right click and select Inspect. You may need to set the Default levels for the console to Verbose in order to see all of the output, however, in most cases that won't be required. In fact, it'll only clutter the list, so select it only when required.

Credits

Music Blocks is a fork of Turtle Blocks JS created by Walter Bender (@walterbender).

Devin Ulibarri has contributed functional and user-interface designs. Many of his contributions were inspired by the music education ideas, representations and practices (e.g. aspects of matrix, musical cups) developed and published by Larry Scripp with whom Devin studied at New England Conservatory and for whom he worked at Affron Scripp & Associates, LLC, Center for Music and the Arts in Education (CMAIE), and Music in Education. Some of the initial graphics were contributed by Chie Yasuda.

Much of the initial coding specific to Music Blocks was done by Yash Khandelwal (@khandelwalYash) as part of Google Summer of Code (GSoC) 2015. Hemant Kasat (@hemantkasat) contributed to additional widgets as part of GSoC 2016. Additional contributions were made by Tayba Wasim (@Tabs16), Dinuka Tharangi Jayaweera (@Tharangi), Prachi Agrawal (@prachiagrawal269), Cristina Del Puerto (@cristinadp), and Hrishi Patel (@Hrishi1999) as part of GSoC 2017. During GSoC 2018, Riya Lohia (@riyalohia) developed a Temperament widget. Ritwik Abhishek (@a-ritwik) added a keyboard widget and a pitch-tracking widget. During GSoC 2019, Favor Kelvin (@fakela) refactored much of the code to use promises. During GSoC 2020, Anindya Kundu (@meganindya) did a major refactoring of the code base to support JavaScript export. Aviral Gangwar (@aviral243) enhanced the internal representation of mode and key. Saksham Mrig (@sksum) fixed 70+ bugs and added support for pitch tracking and MIDI import.

Many students contributed to the project as part of Google Code-in (2015–2019). Sam Parkinson (@samdroid-apps) built the Planet during GCI. Emily Ong (@EmilyOng) designed our mouse icon and Euan Ong (@eohomegrownapps) redesigned the Planet code as a series of GCI tasks. Austin George (@aust-n) refactored the toolbars as a series of GCI tasks. Bottersnike (@Bottersnike) redesigned the widgets and the Block API, Andrea Gonzales (@AndreaGon) made the widgets responsive, Marcus Chong (@pidddgy) refactored the update code, resulting in an order-of-magnitude improvement in CPU usage, and Samyok Nepal (@nepaltechguy2) updated the local storage mechanism to use localForage.

A full list of contributors is available.

Music Blocks in Japan

Gakken STEAM

License

Music Blocks is licensed under the AGPL, which means it will always be free to copy, modify, and hopefully improve. We respect your privacy: while Music Blocks stores your session information in your browser's local storage, it does not and will never access these data for purposes other than to restore your session. Music Blocks will never share these data with any third parties.

There is a Planet where you can share your projects with others and remix projects created by other Music Blocks users. Use of the Planet is anonymous and not required in order to enjoy Music Blocks.

Have fun, play hard, and learn.

musicblocks's People

Contributors

a-ritwik avatar andreagon avatar ashnidh avatar aust-n avatar aviral243 avatar b18050 avatar bottersnike avatar daksh4469 avatar dependabot[bot] avatar emilyong avatar euanong avatar fakela avatar hemantkasat avatar ishakikani9117 avatar kachachan avatar khandelwalyash avatar ksraj123 avatar kushal-khare-official avatar meganindya avatar pidddgy avatar pikurasa avatar pipix51 avatar ricknjacky avatar riyalohia avatar sksum avatar sparsh0204 avatar tabs16 avatar tradzik avatar traitor000 avatar walterbender avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

musicblocks's Issues

FEATURE: Export Matrix as HTML file

So, I think this would be a nice feature b/c...

...because all the people who create matrices (like myself) to help teach music to pre-readers (or for another approach for other reasons) would benefit from this.

There are only so many matrices one person can create in word processing software before they think, "there must be a better way".

Well, it's here! It's already in Music Blocks!

That's amazing!

...so let's make an easy way to export the matrix--maybe both as .png and as .html (but html more important) and free all the people who are doing things the old fashioned way (and bring them one step closer to loving Music Blocks!)

I know this is dangerously close to "feature creep" so I won't even start with my other ideas (like adding bell set graphics and recorder fingerings that correspond to the solfege--oh no! there I go again! -- but seriously, the .html file will get us 50% of the way there).

add ties

A tie clamp will tie two notes together.

@devin: I need more details as to how this should work. If, for example, I have:

c4 tied to c8, I assume it is played as c4 dotted.

But how do I handle c4 tied to d8? The change in pitch.

Lilypond output

We need a save block to export the music in Lilypond (or some other output) format.

FEATURE -- show some graphic for the planet upload/download

screenshot - 10142015 - 09-33-36 pm is there suppose to be an image here
I think that in the original turtleblocks a thumbnail graphic of the resulting image is suppose to show up for the "planet"/"globe" dropdown where users upload/download code.

What should we have for music blocks? Some graphic would be nice, I think.

I think either a thumbnail of some of the matrix output

OR

Music Notation output, if this becomes more robust

Thoughts?

BUG: When mixing Hz and pitches, the action block does not wait for the Hz to end before starting next block

I tried what you see in the picture and the Hz sound overlapped the repeated "sol" sound.

screenshot - 10132015 - 11-35-08 pm when osctime is inside an action block it does not wait full duration before starting next

.tb code is here:

[.tb start]
[[0,["action",{"collapsed":false}],114,90,[null,1,2,null]],[1,["text",{"value":"chunk0"}],208.5,99,[0]],[2,["note",{}],127.5,130.5,[0,3,4,7]],[3,["number",{"value":4}],199.5,130.5,[2]],[4,["pitch",{}],141,162,[2,5,6,null]],[5,["solfege",{"value":"sol"}],214.5,162,[4]],[6,["number",{"value":4}],214.5,193.5,[4]],[7,["note",{}],127.5,256.5,[2,8,9,12]],[8,["number",{"value":4}],199.5,256.5,[7]],[9,["pitch",{}],141,288,[7,10,11,null]],[10,["solfege",{"value":"mi"}],214.5,288,[9]],[11,["number",{"value":4}],214.5,319.5,[9]],[12,["note",{}],127.5,382.5,[7,13,14,20]],[13,["number",{"value":4}],199.5,382.5,[12]],[14,["pitch",{}],141,414,[12,15,16,null]],[15,["solfege",{"value":"re"}],214.5,414,[14]],[16,["number",{"value":4}],214.5,445.5,[14]],[17,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":10,"shade":50,"pensize":5,"grey":100}],462,153,[null,18,null]],[18,["nameddo",{"value":"chunk0"}],475.5,193.5,[17,19]],[19,["nameddo",{"value":"chunk0"}],475.5,225,[18,null]],[20,["osctime",{}],127.5,508.5,[12,21,22,null]],[21,["number",{"value":2}],205.5,508.5,[20]],[22,["sawtooth",{}],141,540,[20,23,null]],[23,["number",{"value":440}],226.5,540,[22]]]
[.tb end]

Build Newton's color scheme demo

Pitch Solfège Colour
C do Red
D re Orange
E mi Yellow
F fa Green
G sol Blue
A la Indigo (Blue Violet)
B ti Purple (Red Violet)

dot dot

don't work properly in the matrix

BUG: Chord for Lilypond

Slight tweak to be able to make multiple notes together.

Think of chords as almost equivalent to single notes: almost everything you can attach to a single note can be attached to a chord, and _everything must go outside the angle brackets_. For example, you can combine markings like beams and ties with chords. They must be placed outside the angle brackets.
http://lilypond.org/doc/v2.18/Documentation/learning/combining-notes-into-chords

Currently, we get this output:
{< g'4 e'4 >c'4 d'4 }
screenshot - 10152015 - 12-22-32 pm multiple notes in one voice parsing is a little off

But, we should be putting in this:
{< g' e' >4 c'4 d'4 }
screenshot - 10152015 - 12-26-52 pm the syntax needs to be adjusted to put stuff outside angle brackets

FEATURE: Play Backwards

We want to be able to:

  1. perform notes in reverse sequence

  2. perform chunks in reverse sequence

Feature: Transposition by Ratio

Transposition by Ratio

So I think we have a great analogy to string instruments. I think we need one for other instruments as well. If we could transpose pitches by ratio we will have achieved an analogy for brass (and string, without frets). The math for this may be a little tricky, but it is well documented.

tabbing

the tab key should cycle through the inputs on a block.

BUG: Note Clamp on Hz family does not seem to be working

Whereas the osctime seems to be working for our pitch blocks, the note clamp does not seem to be working for HZ family blocks yet. I thought that it might be defaulting to ms, but it proved the same result--a very, very short note (see screenshots below--I am great at screenshots, if I do say so myself)

screenshot - 10142015 - 09-26-45 pm hz plays too quickly with note clamp
screenshot - 10142015 - 09-29-17 pm four only makes a blip for hz

IMPROVEMENT: Voices in Lilypond

(Before I start, it would also be nice if lilypond output did not come all on a single line, b/c difficult for humans to parse)

Taking from the info here: http://lilypond.org/doc/v2.18/Documentation/notation/multiple-voices (which seems to me to be the best solution for our particular case. Also see http://lilypond.org/doc/v2.18/Documentation/learning/i_0027m-hearing-voices and http://lilypond.org/doc/v2.18/Documentation/learning/explicitly-instantiating-voices . However, it is my sense these would put us at dead ends pretty quickly).

>instrumentOne = \relative c' {
  c4 d e f |
  R1 |
  d'4 c b a |
  b4 g2 f4 |
  e1 |
}

>instrumentTwo = \relative g' {
  R1 |
  g4 a b c |
  d4 c b a |
  g4 f( e) d |
  e1 |
}

>\<<
  \new Staff \instrumentOne
  \new Staff \instrumentTwo
  \new Staff \partcombine \instrumentOne \instrumentTwo
>\>>

If my Frere Jacques input looks like this (which is current output):

>{ }{ }{g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2  }{r4 r4 r4 r4 r4 r4 r4 r4 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g'4 d'4 g'2  }{r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g'4 d'4 g'2  }{r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g'4 d'4 g'2  }

And generates this in lilypond:
screenshot - 10152015 - 12-49-43 pm okay so it does do all the voices but it does not do them as separate voices for the same staff

I think the program needs to parse to look like this:

>instrumentOne = {g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2 g'4 a'4 b'4 g'4 g'4 a'4 b'4 g'4 b'4 c''4 d''2 b'4 c''4 d''2 d''8 e''8 d''8 c''8 b'4 g'4 d''8 e''8 d''8 c''8 b'4 g'4 g'4 d'4 g'2 g'4 d'4 g'2  }
instrumentTwo = {r4 r4 r4 r4 r4 r4 r4 r4 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g4 d4 g2 g4 a4 b4 g4 g4 a4 b4 g4 b4 c'4 d'2 b4 c'4 d'2 d'8 e'8 d'8 c'8 b4 g4 d'8 e'8 d'8 c'8 b4 g4 g4 d4 g2 g'4 d'4 g'2  }
instrumentThree = {r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g''4 d''4 g''2 g''4 a''4 b''4 g''4 g''4 a''4 b''4 g''4 b''4 c'''4 d'''2 b''4 c'''4 d'''2 d'''8 e'''8 d'''8 c'''8 b''4 g''4 d'''8 e'''8 d'''8 c'''8 b''4 g''4 g''4 d''4 g''2 g'4 d'4 g'2  }
instrumentFour = {r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 r4 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g,4 d,4 g,2 g,4 a,4 b,4 g,4 g,4 a,4 b,4 g,4 b,4 c4 d2 b,4 c4 d2 d8 e8 d8 c8 b,4 g,4 d8 e8 d8 c8 b,4 g,4 g,4 d,4 g,2 g'4 d'4 g'2  }

>\<<
  \new Staff \instrumentOne
  \new Staff \instrumentTwo
  \new Staff \instrumentThree
  \new Staff \instrumentFour
>\>>

screenshot - 10152015 - 01-18-50 pm without part combine looks better i think

Optional part combine (but looks clumsy for some reason): \new Staff \partcombine \instrumentOne \instrumentTwo \instrumentThree \instrumentFour

screenshot - 10152015 - 01-18-13 pm part combine looks a little clumsy

**Note that the lilypond originally put "{}{}" in front of the first voice--I do not know why. I deleted it for the proposed parsing.

[original .tb code start] <==Note that this has unnecessary amount of "save as lilypond" blocks, b/c I first assumed it wouldn't save everything into lilypond, but the software showed me that it can!
[[0,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":20,"shade":50,"pensize":5,"grey":100}],483,107,[null,172,null]],[1,["matrix",{}],883,81,[null,62,null]],[2,["pitch",{}],896.5,310.5,[41,3,4,5]],[3,["text",{"value":"ti"}],970,310.5,[2]],[4,["number",{"value":4}],970,342,[2]],[5,["pitch",{}],896.5,373.5,[2,6,7,8]],[6,["text",{"value":"la"}],970,373.5,[5]],[7,["number",{"value":4}],970,405,[5]],[8,["pitch",{}],896.5,436.5,[5,9,10,98]],[9,["text",{"value":"sol"}],970,436.5,[8]],[10,["number",{"value":4}],970,468,[8]],[11,["rhythm",{}],896.5,562.5,[98,12,13,null]],[12,["number",{"value":4}],970,562.5,[11]],[13,["number",{"value":4}],970,594,[11]],[14,["action",{"collapsed":true}],145,134,[null,15,16,null]],[15,["text",{"value":"chunk0"}],239.5,143,[14]],[16,["note",{}],158.5,174.5,[14,17,18,21]],[17,["number",{"value":4}],230.5,174.5,[16]],[18,["pitch",{}],172,206,[16,19,20,null]],[19,["text",{"value":"sol"}],245.5,206,[18]],[20,["number",{"value":4}],245.5,237.5,[18]],[21,["note",{}],158.5,300.5,[16,22,23,26]],[22,["number",{"value":4}],230.5,300.5,[21]],[23,["pitch",{}],172,332,[21,24,25,null]],[24,["text",{"value":"la"}],245.5,332,[23]],[25,["number",{"value":4}],245.5,363.5,[23]],[26,["note",{}],158.5,426.5,[21,27,28,31]],[27,["number",{"value":4}],230.5,426.5,[26]],[28,["pitch",{}],172,458,[26,29,30,null]],[29,["text",{"value":"ti"}],245.5,458,[28]],[30,["number",{"value":4}],245.5,489.5,[28]],[31,["note",{}],158.5,552.5,[26,32,33,null]],[32,["number",{"value":4}],230.5,552.5,[31]],[33,["pitch",{}],172,584,[31,34,35,null]],[34,["text",{"value":"sol"}],245.5,584,[33]],[35,["number",{"value":4}],245.5,615.5,[33]],[36,["nameddo",{"value":"chunk0"}],817,131,[158,null]],[37,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":30,"shade":50,"pensize":5,"grey":100}],280,80,[null,160,null]],[38,["pitch",{}],896.5,184.5,[62,39,40,41]],[39,["text",{"value":"re"}],970,184.5,[38]],[40,["number",{"value":5}],970,216,[38]],[41,["pitch",{}],896.5,247.5,[38,42,43,2]],[42,["text",{"value":"do"}],970,247.5,[41]],[43,["number",{"value":5}],970,279,[41]],[44,["action",{"collapsed":true}],90,77,[null,45,46,null]],[45,["text",{"value":"chunk1"}],184.5,86,[44]],[46,["note",{}],103.5,117.5,[44,47,48,51]],[47,["number",{"value":4}],175.5,117.5,[46]],[48,["pitch",{}],117,149,[46,49,50,null]],[49,["text",{"value":"ti"}],190.5,149,[48]],[50,["number",{"value":4}],190.5,180.5,[48]],[51,["note",{}],103.5,243.5,[46,52,53,56]],[52,["number",{"value":4}],175.5,243.5,[51]],[53,["pitch",{}],117,275,[51,54,55,null]],[54,["text",{"value":"do"}],190.5,275,[53]],[55,["number",{"value":5}],190.5,306.5,[53]],[56,["note",{}],103.5,369.5,[51,57,58,null]],[57,["number",{"value":2}],175.5,369.5,[56]],[58,["pitch",{}],117,401,[56,59,60,null]],[59,["text",{"value":"re"}],190.5,401,[58]],[60,["number",{"value":5}],190.5,432.5,[58]],[61,["nameddo",{"value":"chunk1"}],817,225.5,[152,null]],[62,["pitch",{}],896.5,121.5,[1,63,64,38]],[63,["text",{"value":"mi"}],970,121.5,[62]],[64,["number",{"value":5}],970,153,[62]],[65,["action",{"collapsed":true}],147,347,[null,66,67,null]],[66,["text",{"value":"chunk2"}],241.5,356,[65]],[67,["note",{}],160.5,387.5,[65,68,69,72]],[68,["number",{"value":8}],232.5,387.5,[67]],[69,["pitch",{}],174,419,[67,70,71,null]],[70,["text",{"value":"re"}],247.5,419,[69]],[71,["number",{"value":5}],247.5,450.5,[69]],[72,["note",{}],160.5,513.5,[67,73,74,77]],[73,["number",{"value":8}],232.5,513.5,[72]],[74,["pitch",{}],174,545,[72,75,76,null]],[75,["text",{"value":"mi"}],247.5,545,[74]],[76,["number",{"value":5}],247.5,576.5,[74]],[77,["note",{}],160.5,639.5,[72,78,79,82]],[78,["number",{"value":8}],232.5,639.5,[77]],[79,["pitch",{}],174,671,[77,80,81,null]],[80,["text",{"value":"re"}],247.5,671,[79]],[81,["number",{"value":5}],247.5,702.5,[79]],[82,["note",{}],160.5,765.5,[77,83,84,87]],[83,["number",{"value":8}],232.5,765.5,[82]],[84,["pitch",{}],174,797,[82,85,86,null]],[85,["text",{"value":"do"}],247.5,797,[84]],[86,["number",{"value":5}],247.5,828.5,[84]],[87,["note",{}],160.5,891.5,[82,88,89,92]],[88,["number",{"value":4}],232.5,891.5,[87]],[89,["pitch",{}],174,923,[87,90,91,null]],[90,["text",{"value":"ti"}],247.5,923,[89]],[91,["number",{"value":4}],247.5,954.5,[89]],[92,["note",{}],160.5,1017.5,[87,93,94,null]],[93,["number",{"value":4}],232.5,1017.5,[92]],[94,["pitch",{}],174,1049,[92,95,96,null]],[95,["text",{"value":"sol"}],247.5,1049,[94]],[96,["number",{"value":4}],247.5,1080.5,[94]],[97,["nameddo",{"value":"chunk2"}],817,320,[154,null]],[98,["pitch",{}],896.5,499.5,[8,99,100,11]],[99,["text",{"value":"re"}],970,499.5,[98]],[100,["number",{"value":4}],970,531,[98]],[101,["action",{"collapsed":true}],187,284,[null,102,103,null]],[102,["text",{"value":"chunk3"}],281.5,293,[101]],[103,["note",{}],200.5,324.5,[101,104,105,108]],[104,["number",{"value":4}],272.5,324.5,[103]],[105,["pitch",{}],214,356,[103,106,107,null]],[106,["text",{"value":"sol"}],287.5,356,[105]],[107,["number",{"value":4}],287.5,387.5,[105]],[108,["note",{}],200.5,450.5,[103,109,110,113]],[109,["number",{"value":4}],272.5,450.5,[108]],[110,["pitch",{}],214,482,[108,111,112,null]],[111,["text",{"value":"re"}],287.5,482,[110]],[112,["number",{"value":4}],287.5,513.5,[110]],[113,["note",{}],200.5,576.5,[108,114,115,null]],[114,["number",{"value":2}],272.5,576.5,[113]],[115,["pitch",{}],214,608,[113,116,117,null]],[116,["text",{"value":"sol"}],287.5,608,[115]],[117,["number",{"value":4}],287.5,639.5,[115]],[118,["nameddo",{"value":"chunk3"}],817,414.5,[156,null]],[119,["action",{"collapsed":true}],108,207,[null,120,121,null]],[120,["text",{"value":"rests"}],202.5,216,[119]],[121,["note",{}],121.5,247.5,[119,122,123,126]],[122,["number",{"value":4}],193.5,247.5,[121]],[123,["pitch",{}],135,279,[121,124,125,null]],[124,["text",{"value":"rest"}],208.5,279,[123]],[125,["number",{"value":4}],208.5,310.5,[123]],[126,["note",{}],121.5,373.5,[121,127,128,131]],[127,["number",{"value":4}],193.5,373.5,[126]],[128,["pitch",{}],135,405,[126,129,130,null]],[129,["text",{"value":"rest"}],208.5,405,[128]],[130,["number",{"value":4}],208.5,436.5,[128]],[131,["note",{}],121.5,499.5,[126,132,133,136]],[132,["number",{"value":4}],193.5,499.5,[131]],[133,["pitch",{}],135,531,[131,134,135,null]],[134,["text",{"value":"rest"}],208.5,531,[133]],[135,["number",{"value":4}],208.5,562.5,[133]],[136,["note",{}],121.5,625.5,[131,137,138,null]],[137,["number",{"value":4}],193.5,625.5,[136]],[138,["pitch",{}],135,657,[136,139,140,null]],[139,["text",{"value":"rest"}],208.5,657,[138]],[140,["number",{"value":4}],208.5,688.5,[138]],[141,["nameddo",{"value":"rests"}],307,152,[160,null]],[142,["action",{"collapsed":false}],790,59,[null,143,158,null]],[143,["text",{"value":"melody"}],884.5,68,[142]],[144,["nameddo",{"value":"melody"}],510,179,[172,null]],[145,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":40,"shade":50,"pensize":5,"grey":100}],90,202,[null,162,null]],[146,["nameddo",{"value":"melody"}],130.5,400,[174,null]],[147,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":50,"shade":50,"pensize":5,"grey":100}],629,73,[null,164,null]],[148,["nameddo",{"value":"melody"}],669.5,271,[178,null]],[149,["nameddo",{"value":"rests"}],117,274,[162,null]],[150,["nameddo",{"value":"rests"}],656,145,[164,null]],[151,["nameddo",{"value":"melody"}],320.5,278,[176,null]],[152,["repeat",{}],803.5,194,[158,153,61,154]],[153,["number",{"value":2}],875.5,194,[152]],[154,["repeat",{}],803.5,288.5,[152,155,97,156]],[155,["number",{"value":2}],875.5,288.5,[154]],[156,["repeat",{}],803.5,383,[154,157,118,null]],[157,["number",{"value":2}],875.5,383,[156]],[158,["repeat",{}],803.5,99.5,[142,159,36,152]],[159,["number",{"value":2}],875.5,99.5,[158]],[160,["repeat",{}],293.5,120.5,[37,161,141,170]],[161,["number",{"value":2}],365.5,120.5,[160]],[162,["repeat",{}],103.5,242.5,[145,163,149,168]],[163,["number",{"value":4}],175.5,242.5,[162]],[164,["repeat",{}],642.5,113.5,[147,165,150,166]],[165,["number",{"value":6}],714.5,113.5,[164]],[166,["settransposition",{}],642.5,208,[164,167,178,182]],[167,["number",{"value":-24}],798.5,208,[166]],[168,["settransposition",{}],103.5,337,[162,169,174,186]],[169,["number",{"value":12}],259.5,337,[168]],[170,["settransposition",{}],293.5,215,[160,171,176,180]],[171,["number",{"value":-12}],449.5,215,[170]],[172,["repeat",{}],496.5,147.5,[0,173,144,184]],[173,["number",{"value":4}],568.5,147.5,[172]],[174,["repeat",{}],117,368.5,[168,175,146,null]],[175,["number",{"value":4}],189,368.5,[174]],[176,["repeat",{}],307,246.5,[170,177,151,null]],[177,["number",{"value":4}],379,246.5,[176]],[178,["repeat",{}],656,239.5,[166,179,148,null]],[179,["number",{"value":4}],728,239.5,[178]],[180,["savelilypond",{}],293.5,372.5,[170,181,null]],[181,["text",{"value":"FJ Tenor.ly"}],427,372.5,[180]],[182,["savelilypond",{}],642.5,365.5,[166,183,null]],[183,["text",{"value":"FJ Bass.ly"}],776,365.5,[182]],[184,["savelilypond",{}],496.5,242,[172,185,null]],[185,["text",{"value":"FJ Alto.ly"}],630,242,[184]],[186,["savelilypond",{}],103.5,494.5,[168,187,null]],[187,["text",{"value":"FJ Soprano.ly"}],237,494.5,[186]]]
[original .tb code end]

DESIGN DECISIONS: More Robust Aggregation for LilyPond output

I like Walter's reasoning for aggregating the output for LilyPond output for notation (basically, so that kids can do a kind of "real time performance" and then have the performance be recorded as LilyPond output).

However, I think that we need to make a friendly and robust logical system for users to do this.

Q) Maybe there is a "record for LilyPond button" where users choose when to start stop?

There are a few issues with the way it aggregates the output currently.

  1. How do we make it more obvious when the start and stop is for their recording?
  2. How do we make it more obvious in the score which is "button pushing" and which is "pressing play/record"? And which is press play/record first time, second time, third time, etc.?

Currently, I am getting scores where a new voice is introduced within the middle of the score that starts from the begging of a different project (because the program doesn't put things in order of time). See below.

I would actually be tempted, for v1, to just have Music Blocks output a "snapshot" for the LilyPond output of the code on the screen--maybe have a "live recording for LilyPond" button--and leave other forms of aggregation on the table for future versions. Let's get simple stuff working well first.

screenshot - 10212015 - 08-20-17 pm we need a better way to aggregate these extra notes

Also, it isn't very obvious where to put a "save as LilyPond" block, in an instance like this (I think a "snapshot" approach makes more sense in a case like this):

screenshot - 10212015 - 07-22-02 pm in this situation i am a little puzzled as to where i should put the lilypond block

Weird bug that changes the register when block is at end of string (like a "save as lilypond" block) -- CORNER CASE

At first, I thought that this was a Lilypond output error because I noticed it in the notation first. But as I listened to the playback again, I realized that it has something to do with Music Blocks' performance.

It seems that, when a "save as lilypond" block (or V space block -- see pic) is at the end of a string, that the very, very, very last part of the contained "action" (aka chunk) is performed without a repeat (possibly without any modifier -- NOT TESTED).

screenshot - 10182015 - 09-10-00 pm theory confirmed with v space block

I first discovered this b/c I had a "save as lilypond" block at the end of each "action" block, but tested and confirmed "v space" at the end has same behavior (above).

See the errant results below:

screenshot - 10182015 - 09-13-55 pm register two octaves too high

Last three notes (which was a single chunk) is in the original register (not transposed down -24, like it is suppose to).

restore matrix

My current idea is that if you drop a chunk into the matrix, it will restore the matrix to the values in the chunk

BUG: Notes stay lit up during debug and [no music turtle -- slow run?]

I expect that the notes that light up would dim after they are played.

Is there a reason for the note value clamps to stay lit up even after they have finished playing?

screenshot - 10082015 - 04-58-17 pm why do all the note values stay lit up musicblocks
This is me playing the last note of this stack using the [snail -- note by note option]. All previous note clamps remain lit up, which is misleading I think.

BUG: Matrix is not parsing the tuplets well

Picture below, but I think it makes more sense if you try it (.tb underneath the picture)

screenshot - 10222015 - 05-12-05 pm does not seem to be parsing this well

[start .tb]
[[0,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":50,"shade":50,"pensize":5,"grey":100}],250,150,[null,null,null]],[1,["matrix",{}],197,-104,[null,23,null]],[2,["pitch",{}],210.5,62.5,[20,3,4,17]],[3,["solfege",{"value":"sol"}],284,62.5,[2]],[4,["number",{"value":4}],284,94,[2]],[5,["pitch",{}],210.5,188.5,[17,6,7,8]],[6,["solfege",{"value":"mi"}],284,188.5,[5]],[7,["number",{"value":4}],284,220,[5]],[8,["pitch",{}],210.5,251.5,[5,9,10,14]],[9,["solfege",{"value":"re"}],284,251.5,[8]],[10,["number",{"value":4}],284,283,[8]],[11,["rhythm",{}],237.5,472,[26,12,13,null]],[12,["number",{"value":3}],311,472,[11]],[13,["number",{"value":8}],311,503.5,[11]],[14,["pitch",{}],210.5,314.5,[8,15,16,29]],[15,["solfege",{"value":"do"}],284,314.5,[14]],[16,["number",{"value":4}],284,346,[14]],[17,["pitch",{}],210.5,125.5,[2,18,19,5]],[18,["solfege",{"value":"fa"}],284,125.5,[17]],[19,["number",{"value":4}],284,157,[17]],[20,["pitch",{}],210.5,-0.5,[23,21,22,2]],[21,["solfege",{"value":"la"}],284,-0.5,[20]],[22,["number",{"value":4}],284,31,[20]],[23,["pitch",{}],210.5,-63.5,[1,24,25,20]],[24,["solfege",{"value":"do"}],284,-63.5,[23]],[25,["number",{"value":5}],284,-32,[23]],[26,["tuplet2",{}],224,409,[29,27,28,11,null]],[27,["number",{"value":1}],296,409,[26]],[28,["number",{"value":4}],296,440.5,[26]],[29,["repeat",{}],210.5,377.5,[14,30,26,null]],[30,["number",{"value":4}],282.5,377.5,[29]]]
[end .tb]

change tempo

Is there some way to use Tone.js to do this for us?

IMPROVEMENT: Parsing voices when note values are simultaneous

Not Mission Critical!

It would be nice if when inputting chords that behave as simultaneous voices (like in the example below), Music Blocks were able to understand that the very low notes can be, and should be put into a separate staff for its respective register.

screenshot - 10212015 - 06-47-28 pm chords working -- program doesn t really distinguish what i am thinking but maybe not a problem

[.ly start]
\version "2.18.2"

% ****************************************************************
% 
% WHAT IS THIS? -- This is a LilyPond file generated from Music
% Blocks software (Read about it at www.musicblocks.net).
% 
% DOWNLOAD LILYPOND -- In order to create notation with this file,
% you will need to download and install LilyPond software onto your
% computer (http://lilypond.org/download.html).  Frescobaldi
% software is also handy for editing LilyPond files
% (http://frescobaldi.org/download)
% 
% LILYPOND INSTRUCTIONS -- For instructions on how to further
% manipulate the musical notation using LilyPond software, please
% read the Introduction (http://lilypond.org/text-input.html) and
% the Manual
% (http://lilypond.org/doc/v2.18/Documentation/learning/index.html)
% 
% GLOSSARY -- A glossary with very helpful examples may be found
% HERE (http://www.lilypond.org/doc/v2.19/Documentation/music-glossary/)
% 
% MUTOPIA -- You may also benefit from studying scores from the
% Mutopia Project website, which has freely sharable music notation
% generated with LilyPond (http://www.mutopiaproject.org/)
% 
% COMMENTS -- Some of the code below is commented out, but you can
% initiate it by deleting the that precedes the text or, in the
% case of a commented section, deleting the %{ and }that surrounds
% the section.
% 
% ****************************************************************
\header {
% Please add your own name, title of your musical creation, and intended copyright below!
dedication = "Made with LilyPond and Music Blocks -- http://walterbender.github.io/musicblocks/"
title = "My Music Blocks Creation"
% subtitle = "Subtitle"
% instrument = "Instrument"
composer = "Mr. Mouse"
% arranger = "Arranger"
% The copyright below is great for sharing (and re-sharing)!
% Read about it here (http://creativecommons.org/licenses/by-sa/4.0/).
% Of course, you can use any copyright you like -- you made it!
copyright = "Mr. Mouse (c) 2015 -- CC-BY-SA"
tagline = "Made from Music Blocks v.0.9"
}

% You can change the meter by uncommenting the code below (delete the percent sign) and making adjustments.

%{ global = {
  \time 3/4
  \key c \minor
 }
%}

\score {
<<
>>
% GUITAR TAB -- Delete the %{ and }% (comment-section indicator) below for guitar tablature output.
%{
    \new TabStaff = "guitar tab" 
<<
      \clef moderntab
>>
%}
%{
<<
      \numericTimeSignature
      \clef "G_8"
      \global
      \mergeDifferentlyHeadedOn
>>
%}
\layout { }
}
% MIDI -- Delete the two %{ (comment-section indicator) below for midi as well
%{  \midi {
    \tempo 4=90
  }
%}
mouse = {
< e'' c'' c > 4 < f'' b' g, > 4 < e'' c'' c > 4 < f'' b' g, > 4 < e'' c'' c > 4 < f'' b' g, > 4 < e'' c'' c > 4 < f'' b' g, > 4 
}

\score {
<<
  \new Staff = "treble"
  {
    \clef "treble"
    \set Staff.instrumentName = #"mouse" \mouse
  }
>>
% GUITAR TAB -- Delete the %{ and }% (comment-section indicator) below for guitar tablature output.
%{
    \new TabStaff = "guitar tab" 
<<
      \clef moderntab
      \context TabVoice = "mouse" \mouse
>>
%}
%{
<<
      \numericTimeSignature
      \clef "G_8"
      \global
      \mergeDifferentlyHeadedOn
      \context Voice = "mouse" \mouse
>>
%}
\layout { }
}
% MIDI -- Delete the two %{ (comment-section indicator) below for midi as well
%{  \midi {
    \tempo 4=90
  }
%}
[.ly end]

_Instead, it should look like this:_

[.ly start]
\version "2.18.2"

% ****************************************************************
% 
% WHAT IS THIS? -- This is a LilyPond file generated from Music
% Blocks software (Read about it at www.musicblocks.net).
% 
% DOWNLOAD LILYPOND -- In order to create notation with this file,
% you will need to download and install LilyPond software onto your
% computer (http://lilypond.org/download.html).  Frescobaldi
% software is also handy for editing LilyPond files
% (http://frescobaldi.org/download)
% 
% LILYPOND INSTRUCTIONS -- For instructions on how to further
% manipulate the musical notation using LilyPond software, please
% read the Introduction (http://lilypond.org/text-input.html) and
% the Manual
% (http://lilypond.org/doc/v2.18/Documentation/learning/index.html)
% 
% GLOSSARY -- A glossary with very helpful examples may be found
% HERE (http://www.lilypond.org/doc/v2.19/Documentation/music-glossary/)
% 
% MUTOPIA -- You may also benefit from studying scores from the
% Mutopia Project website, which has freely sharable music notation
% generated with LilyPond (http://www.mutopiaproject.org/)
% 
% COMMENTS -- Some of the code below is commented out, but you can
% initiate it by deleting the that precedes the text or, in the
% case of a commented section, deleting the %{ and }that surrounds
% the section.
% 
% ****************************************************************
\header {
% Please add your own name, title of your musical creation, and intended copyright below!
dedication = "Made with LilyPond and Music Blocks -- http://walterbender.github.io/musicblocks/"
title = "My Music Blocks Creation"
% subtitle = "Subtitle"
% instrument = "Instrument"
composer = "Mr. Mouse"
% arranger = "Arranger"
% The copyright below is great for sharing (and re-sharing)!
% Read about it here (http://creativecommons.org/licenses/by-sa/4.0/).
% Of course, you can use any copyright you like -- you made it!
copyright = "Mr. Mouse (c) 2015 -- CC-BY-SA"
tagline = "Made from Music Blocks v.0.9"
}

% You can change the meter by uncommenting the code below (delete the percent sign) and making adjustments.

%{ global = {
  \time 3/4
  \key c \minor
 }
%}

mouse = {
< e'' c'' > 4 < f'' b' > 4 < e'' c'' > 4 < f'' b' > 4 < e'' c'' > 4 < f'' b' > 4 < e'' c'' > 4 < f'' b' > 4 
}

brown_rat = {
c4 g,4 c4 g,4 c4 g,4 c4 g,4 
}

\score {
<<
  \new Staff = "treble"
  {
    \clef "treble"
    \set Staff.instrumentName = #"mouse" \mouse
  }
  \new Staff = "bass_8"
  {
    \clef "bass_8"
    \set Staff.instrumentName = #"brown_rat" \brown_rat
  }
>>
% GUITAR TAB -- Delete the %{ and }% (comment-section indicator) below for guitar tablature output.
%{
    \new TabStaff = "guitar tab" 
<<
      \clef moderntab
      \context TabVoice = "mouse" \mouse
      \context TabVoice = "brown_rat" \brown_rat
>>
%}
%{
<<
      \numericTimeSignature
      \clef "G_8"
      \global
      \mergeDifferentlyHeadedOn
      \context Voice = "mouse" \mouse
      \context Voice = "brown_rat" \brown_rat
>>
%}
\layout { }
}
% MIDI -- Delete the two %{ (comment-section indicator) below for midi as well
%{  \midi {
    \tempo 4=90
  }
%}
[.ly end]

text imput

There is something a bit clumsy about the current implementation. And on FireFox, it often doesn't properly update the block label to match the new value.

User Interaction for Matrix Improvement

User Interaction for Matrix
a) The "Parts and Crafts" people (who I showed this software to) were critical about how unforgiving the matrix is if someone inputs the wrong rhythm. Right now, if the user puts the incorrect rhythm in they must re-render the entire matrix.

MY PROPOSED SOLUTION:
I do not necessarily like the idea of having "draggable" columns for a couple of different reasons (e.g. how would the program arbitrate the note value?). I think what we need, rather, is to be able to add rhythm blocks to the matrix clamp and then be able to re-render the matrix without clearing the selected notes.

This is what the behavior would be like --
A) If the change adds a new note to the matrix, when the matrix is re-rendered all of the other columns would remain unaffected but the new column will be completely blank by default
B) If the change deletes a note that had a note(s) chosen, those note(s) will simply disappear, but all other unchanged notes will remain unaffected.
C) We need a "re-render" button as a separate button from "clear" (which will be used by the user for a complete restart)

[I suppose the behavior should be the same for if a pitch block is added or removed]

MINOR ISSUE: Matrix Highlight

Others who have tried Music Blocks have mentioned this.

It may get down to deeper design decision on our part, (however I do like that the matrix is HTML b/c it can be exported and then manipulated, so I would hesitate changing that aspect).

screenshot - 10212015 - 07-21-04 pm minor annoyance -- matrix highlight

Tuplets issue -- Lilypond Parsing

When I play tuplets in Music Blocks as is in this file:

[start .tb]
[[0,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":0,"shade":50,"pensize":5,"grey":100}],486,-291,[null,103,null]],[1,["matrix",{}],868,-138,[null,26,null]],[2,["pitch",{}],881.5,217.5,[14,13,3,4]],[3,["number",{"value":4}],955,249,[2]],[4,["pitch",{}],881.5,280.5,[2,12,5,6]],[5,["number",{"value":4}],955,312,[4]],[6,["pitch",{}],881.5,343.5,[4,11,7,8]],[7,["number",{"value":4}],955,375,[6]],[8,["rhythm",{}],881.5,406.5,[6,9,10,null]],[9,["number",{"value":8}],955,406.5,[8]],[10,["number",{"value":4}],955,438,[8]],[11,["solfege",{"value":"do"}],955,343.5,[6]],[12,["solfege",{"value":"re"}],955,280.5,[4]],[13,["solfege",{"value":"mi"}],955,217.5,[2]],[14,["pitch",{}],881.5,154.5,[17,15,16,2]],[15,["solfege",{"value":"fa"}],955,154.5,[14]],[16,["number",{"value":4}],955,186,[14]],[17,["pitch",{}],881.5,91.5,[20,18,19,14]],[18,["solfege",{"value":"sol"}],955,91.5,[17]],[19,["number",{"value":4}],955,123,[17]],[20,["pitch",{}],881.5,28.5,[23,21,22,17]],[21,["solfege",{"value":"la"}],955,28.5,[20]],[22,["number",{"value":4}],955,60,[20]],[23,["pitch",{}],881.5,-34.5,[26,24,25,20]],[24,["solfege",{"value":"ti"}],955,-34.5,[23]],[25,["number",{"value":4}],955,-3,[23]],[26,["pitch",{}],881.5,-97.5,[1,27,28,23]],[27,["solfege",{"value":"do"}],955,-97.5,[26]],[28,["number",{"value":5}],955,-66,[26]],[29,["action",{"collapsed":false}],201,-197,[null,30,95,null]],[30,["text",{"value":"chunk0"}],295.5,-188,[29]],[31,["note",{}],228,-125,[95,32,33,null]],[32,["number",{"value":12}],300,-125,[31]],[33,["pitch",{}],241.5,-93.5,[31,34,35,36]],[34,["text",{"value":"sol"}],315,-93.5,[33]],[35,["number",{"value":4}],315,-62,[33]],[36,["pitch",{}],241.5,-30.5,[33,37,38,null]],[37,["text",{"value":"fa"}],315,-30.5,[36]],[38,["number",{"value":4}],315,1,[36]],[39,["note",{}],228,127,[99,40,41,null]],[40,["number",{"value":12}],300,127,[39]],[41,["pitch",{}],241.5,158.5,[39,42,43,44]],[42,["text",{"value":"sol"}],315,158.5,[41]],[43,["number",{"value":4}],315,190,[41]],[44,["pitch",{}],241.5,221.5,[41,45,46,null]],[45,["text",{"value":"mi"}],315,221.5,[44]],[46,["number",{"value":4}],315,253,[44]],[47,["note",{}],228,379,[101,48,49,null]],[48,["number",{"value":12}],300,379,[47]],[49,["pitch",{}],241.5,410.5,[47,50,51,52]],[50,["text",{"value":"ti"}],315,410.5,[49]],[51,["number",{"value":4}],315,442,[49]],[52,["pitch",{}],241.5,473.5,[49,53,54,null]],[53,["text",{"value":"re"}],315,473.5,[52]],[54,["number",{"value":4}],315,505,[52]],[55,["note",{}],214.5,599.5,[101,56,57,63]],[56,["number",{"value":12}],286.5,599.5,[55]],[57,["pitch",{}],228,631,[55,58,59,60]],[58,["text",{"value":"la"}],301.5,631,[57]],[59,["number",{"value":4}],301.5,662.5,[57]],[60,["pitch",{}],228,694,[57,61,62,null]],[61,["text",{"value":"mi"}],301.5,694,[60]],[62,["number",{"value":4}],301.5,725.5,[60]],[63,["note",{}],214.5,788.5,[55,64,65,97]],[64,["number",{"value":12}],286.5,788.5,[63]],[65,["pitch",{}],228,820,[63,66,67,68]],[66,["text",{"value":"ti"}],301.5,820,[65]],[67,["number",{"value":4}],301.5,851.5,[65]],[68,["pitch",{}],228,883,[65,69,70,null]],[69,["text",{"value":"re"}],301.5,883,[68]],[70,["number",{"value":4}],301.5,914.5,[68]],[71,["note",{}],228,1009,[97,72,73,null]],[72,["number",{"value":12}],300,1009,[71]],[73,["pitch",{}],241.5,1040.5,[71,74,75,76]],[74,["text",{"value":"do"}],315,1040.5,[73]],[75,["number",{"value":5}],315,1072,[73]],[76,["pitch",{}],241.5,1103.5,[73,77,78,null]],[77,["text",{"value":"do"}],315,1103.5,[76]],[78,["number",{"value":4}],315,1135,[76]],[79,["note",{}],214.5,1229.5,[97,80,81,87]],[80,["number",{"value":12}],286.5,1229.5,[79]],[81,["pitch",{}],228,1261,[79,82,83,84]],[82,["text",{"value":"ti"}],301.5,1261,[81]],[83,["number",{"value":4}],301.5,1292.5,[81]],[84,["pitch",{}],228,1324,[81,85,86,null]],[85,["text",{"value":"re"}],301.5,1324,[84]],[86,["number",{"value":4}],301.5,1355.5,[84]],[87,["note",{}],214.5,1418.5,[79,88,89,null]],[88,["number",{"value":12}],286.5,1418.5,[87]],[89,["pitch",{}],228,1450,[87,90,91,92]],[90,["text",{"value":"la"}],301.5,1450,[89]],[91,["number",{"value":4}],301.5,1481.5,[89]],[92,["pitch",{}],228,1513,[89,93,94,null]],[93,["text",{"value":"mi"}],301.5,1513,[92]],[94,["number",{"value":4}],301.5,1544.5,[92]],[95,["repeat",{}],214.5,-156.5,[29,96,31,99]],[96,["number",{"value":6}],286.5,-156.5,[95]],[97,["repeat",{}],214.5,977.5,[63,98,71,79]],[98,["number",{"value":4}],286.5,977.5,[97]],[99,["repeat",{}],214.5,95.5,[95,100,39,101]],[100,["number",{"value":6}],286.5,95.5,[99]],[101,["repeat",{}],214.5,347.5,[99,102,47,55]],[102,["number",{"value":4}],286.5,347.5,[101]],[103,["nameddo",{"value":"chunk0"}],499.5,-250.5,[0,104]],[104,["savelilypond",{}],499.5,-219,[103,105,null]],[105,["text",{"value":"MANUAL TRIPLET -- chopsticks triplet test MULT in CHUNK.ly"}],633,-219,[104]]]
[end .tb]

I get this .ly file, which does not have accurate parsing of the triplets:
[start .ly]
\version "2.18.2"

% ****************************************************************
%
% WHAT IS THIS? -- This is a LilyPond file generated from Music
% Blocks software (Read about it at www.musicblocks.net).
%
% DOWNLOAD LILYPOND -- In order to create notation with this file,
% you will need to download and install LilyPond software onto your
% computer (http://lilypond.org/download.html). Frescobaldi
% software is also handy for editing LilyPond files
% (http://frescobaldi.org/download)
%
% LILYPOND INSTRUCTIONS -- For instructions on how to further
% manipulate the musical notation using LilyPond software, please
% read the Introduction (http://lilypond.org/text-input.html) and
% the Manual
% (http://lilypond.org/doc/v2.18/Documentation/learning/index.html)
%
% GLOSSARY -- A glossary with very helpful examples may be found
% HERE (http://www.lilypond.org/doc/v2.19/Documentation/music-glossary/)
%
% MUTOPIA -- You may also benefit from studying scores from the
% Mutopia Project website, which has freely sharable music notation
% generated with LilyPond (http://www.mutopiaproject.org/)
%
% COMMENTS -- Some of the code below is commented out, but you can
% initiate it by deleting the that precedes the text or, in the
% case of a commented section, deleting the %{ and }that surrounds
% the section.
%
% ****************************************************************
\header {
% Please add your own name, title of your musical creation, and intended copyright below!
dedication = "Made with LilyPond and Music Blocks -- http://walterbender.github.io/musicblocks/"
title = "My Music Blocks Creation"
% subtitle = "Subtitle"
% instrument = "Instrument"
composer = "Mr. Mouse"
% arranger = "Arranger"
% The copyright below is great for sharing (and re-sharing)!
% Read about it here (http://creativecommons.org/licenses/by-sa/4.0/).
% Of course, you can use any copyright you like -- you made it!
copyright = "Mr. Mouse (c) 2015 -- CC-BY-SA"
tagline = "Made from Music Blocks v.0.9"
}

% You can change the meter by uncommenting the code below (delete the percent sign) and making adjustments.

%{ global = {
\time 3/4
\key c \minor
}
%}

red_squirrel = {
< g' f' > 4-3 < g' f' > 4-3 < g' f' > 4-3 < g' f' > 4-3 < g' f' > 4-3 < g' f' > 4-3 < g' e' > 4-3 < g' e' > 4-3 < g' e' > 4-3 < g' e' > 4-3 < g' e' > 4-3 < g' e' > 4-3 < b' d' > 4-3 < b' d' > 4-3 < b' d' > 4-3 < b' d' > 4-3 < a' e' > 4-3 < b' d' > 4-3 < c'' c' > 4-3 < c'' c' > 4-3 < c'' c' > 4-3 < c'' c' > 4-3 < b' d' > 4-3 < a' e' > 4-3
}

\score {
<<
\new Staff = "treble"
{
\clef "treble"
\set Staff.instrumentName = #"red squirrel" \red_squirrel
}

% GUITAR TAB -- Delete the %{ and }% (comment-section indicator) below for guitar tablature output.
%{
\new TabStaff = "guitar tab"
<<
\clef moderntab
\context TabVoice = "red squirrel" \red squirrel

%}
%{
<<
\numericTimeSignature
\clef "G_8"
\global
\mergeDifferentlyHeadedOn
\context Voice = "red squirrel" \red squirrel

%}
\layout { }
}
% MIDI -- Delete the two %{ (comment-section indicator) below for midi as well
%{ \midi {
\tempo 4=90
}
%}
[end .ly]

screenshot - 10212015 - 04-51-24 pm incorrect tuplets chopsticks

I should get this:
[start .ly]
\version "2.18.2"
\header {
dedication = "Description: http://walterbender.github.io/musicblocks/"
title = "Title: My Music Blocks Creation"
subtitle = "Subtitle:"
instrument = "Instrument:"
composer = "Composer: Mr. Mouse"
arranger = "Arranger:"
copyright = "Copyright: Mr. Mouse (c) 2015 -- CC-SA-BY"
tagline = "Made from MB v. 328bc6d"
}

capybara = {
\tuplet 3/2 { < g' f' > 8 < g' f' > 8 < g' f' > 8 } \tuplet 3/2 { < g' f' > 8 < g' f' > 8 < g' f' > 8 } \tuplet 3/2 { < g' e' > 8 < g' e' > 8 < g' e' > 8 } \tuplet 3/2 { < g' e' > 8 < g' e' > 8 < g' e' > 8 } \tuplet 3/2 { < b' d' > 8 < b' d' > 8 < b' d' > 8 } \tuplet 3/2 { < b' d' > 8 < a' e' > 8 < b' d' > 8 } \tuplet 3/2 { < c'' c' > 8 < c'' c' > 8 < c'' c' > 8 } \tuplet 3/2 { < c'' c' > 8 < b' d' > 8 < a' e' > 8 }
}

\score {
<<
\new Staff = "treble" {
\clef "treble"
\set Staff.instrumentName = #"capybara" \capybara
}

\layout { }
}
[end .ly]

screenshot - 10212015 - 04-50-05 pm correct tuplet chopsticks

BUG: Block motion becomes separate

Symptom: Block movement happens quite far away from the actual location of the mouse.

What seems to causing it at the UI level: I notice that the behavior seems to start when I click to unlock the screen.

(video sent separately to Walter and Yash)

Invert Pitches (based on pitch interval)

Invert pitches
This would invert pitches around a specified pitch. Inverting E(octave)4 around C4 would result in Ab3, for example (Going down 4 half-steps instead of up 4 half-steps).

Perhaps, in order to do this, we need a way for the program to analyze the distance between two simultaneous notes first, which would be nice in and of itself.

Feature: Skip every nth note

"Skip every nth note"
This is as close to a kind of inverse operator as I could think of for our "duplicate note" clamp. It would skip every nth note in a series of notes.

An advanced feature of this could be "skip and replace (insert?)", where someone could insert notes (or rests or actions) inside the replaced notes.

playback notes slowly

we can play the program slowly -- a fixed pause between each block -- but we would also like to playback just the notes slowly.

@devin:

You asked for a mechanism for playing back the notes slowly. But I can
think of at least three ways to do this:

Original: c4 d4 e8 f8
Slow 1: c2 d2 e4 f4
Slow 2: c4 r4 d4 r4 e8 r4 f8 r4
Slow 3: c4 r4 d4 r4 e8 r8 f8 r8

There are others too... which do you think makes the most sense both
musically and in terms of debugging? (We can have more than one way, a
decent default would be good.)

Octave Argument does not seem to be transferring over to chunk creation.

See the picture. The two pitches in the clamp--one should be a do5, not both being do4. They were generated from matrix on right. These should correspond to the 6th column.

(for those who have read my previous issue, please note that I manually changed "si" to "ti" before taking this screenshot)
screenshot - 10072015 - 09 05 29 am octave does not seem to be transferring over to chunk upon generation

BUG: Blocks fly apart

This is a known issue, but I do not see it with the other issues. Sometimes, when running the program, the blocks in a stack and their respective arguments will "fly apart". They are connected in terms of the program--meaning the program still understands everything to be part of the same stack--however, they will visually break apart across the screen and moving the blocks more only makes things worse.

screenshot - 10132015 - 02-13-38 pm blocks flying apart
The stack should have the two chunks inside the transpose block, with the "1" number argument connected to the "adjust transposition" block.
"set beats per minute" should be connected to "240" number block as argument.

QUESTION -- What does "transpose" block do to Hz blocks?

screenshot - 10142015 - 06-13-56 pm what does this do--does it raise the hz by 1

I think that it should probably ignore the "mixed metaphors" that arise from the above image. (I am not really able to tell if it is raising the Hz from 440-441 by ear).

...actually the log says the following:
dispatching _playnote_0
logo.js:1878 notes to play G#4
logo.js:2204 dispatching _playnote_0
logo.js:1878 notes to play F4
logo.js:2204 dispatching _playnote_0
logo.js:1878 notes to play D#4
logo.js:2204 dispatching _playnote_0
logo.js:1844 tone to play 440

WHICH IS GOOD!

Opened and Closed. Created for posterity.

Input for seconds for "osctime" (?and note block?)

Okay, the logic for the Hz blocks is much better, but I thought that "osctime" block would take input in seconds (and that would be its defining characteristic). Currently, it behaves just like the "note" block.

We need to either:

  1. Keep "osctime" to a milliseconds only (for input argument) block
  2. Allow for both "note value" and " duration in milliseconds" input to "osctime"
  3. If 2, then possibly introduce this to our note block as well.

My gut feeling is just do 1 from this list, but have it take "pitch" blocks as potential arguments (and visa versa).

BUG: When nothing is inside the start clamp, the big "play" rabbit has funny behavior

Check out the pics.

Everything seems fine when something is in the start clamp, but if nothing is in start clamp the big "play" rabbit seems to create a matrix (and the matrix is not completely accurate--it keeps adding "re" everytime it is clicked).

You should know that I am using Firefox with FaceBook script blocked <===what is facebook doing, anyway?

screenshot - 10082015 - 04-37-24 pm when i click the rabbit this matrix appears and the matrix is not accurate firefox no fb script
After clicking the rabbit with nothing inside "start"

screenshot - 10082015 - 04-39-13 pm when something is inside the start clamp everything is dandy
...when something is inside "start" everything is fine (no matrix generated)

Matrix infinite playback

Yes this was reproduced! Maybe has something to do with tuplet parsing

When I generated this matrix and then clicked on the matrix buttons, it played the sounds infinitely

[start .tb]
[[0,["start",{"collapsed":false,"xcor":0,"ycor":0,"heading":0,"color":50,"shade":50,"pensize":5,"grey":100}],250,150,[null,null,null]],[1,["matrix",{}],144,15,[null,23,null]],[2,["pitch",{}],157.5,181.5,[20,3,4,17]],[3,["solfege",{"value":"sol"}],231,181.5,[2]],[4,["number",{"value":4}],231,213,[2]],[5,["pitch",{}],157.5,307.5,[17,6,7,8]],[6,["solfege",{"value":"mi"}],231,307.5,[5]],[7,["number",{"value":4}],231,339,[5]],[8,["pitch",{}],157.5,370.5,[5,9,10,14]],[9,["solfege",{"value":"re"}],231,370.5,[8]],[10,["number",{"value":4}],231,402,[8]],[11,["rhythm",{}],236.5,814.5,[null,12,13,null]],[12,["number",{"value":"2"}],310,814.5,[11]],[13,["number",{"value":"4"}],310,846,[11]],[14,["pitch",{}],157.5,433.5,[8,15,16,62]],[15,["solfege",{"value":"do"}],231,433.5,[14]],[16,["number",{"value":4}],231,465,[14]],[17,["pitch",{}],157.5,244.5,[2,18,19,5]],[18,["solfege",{"value":"fa"}],231,244.5,[17]],[19,["number",{"value":4}],231,276,[17]],[20,["pitch",{}],157.5,118.5,[23,21,22,2]],[21,["solfege",{"value":"la"}],231,118.5,[20]],[22,["number",{"value":4}],231,150,[20]],[23,["pitch",{}],157.5,55.5,[1,24,25,20]],[24,["solfege",{"value":"do"}],231,55.5,[23]],[25,["number",{"value":5}],231,87,[23]],[26,["rhythm",{}],231,684,[null,27,28,null]],[27,["number",{"value":"1"}],304.5,684,[26]],[28,["number",{"value":"6"}],304.5,715.5,[26]],[29,["rhythm",{}],171,528,[62,30,31,null]],[30,["number",{"value":1}],244.5,528,[29]],[31,["number",{"value":12}],244.5,559.5,[29]],[32,["rhythm",{}],94.5,695,[null,33,34,null]],[33,["number",{"value":"1"}],168,695,[32]],[34,["number",{"value":"2"}],168,726.5,[32]],[35,["action",{"collapsed":true}],1064,126,[null,36,37,null]],[36,["text",{"value":"chunk"}],1158.5,135,[35]],[37,["note",{}],1077.5,166.5,[35,38,39,42]],[38,["number",{"value":4}],1149.5,166.5,[37]],[39,["pitch",{}],1091,198,[37,40,41,null]],[40,["solfege",{"value":"do"}],1164.5,198,[39]],[41,["number",{"value":4}],1164.5,229.5,[39]],[42,["note",{}],1077.5,292.5,[37,43,44,47]],[43,["number",{"value":4}],1149.5,292.5,[42]],[44,["pitch",{}],1091,324,[42,45,46,null]],[45,["solfege",{"value":"do"}],1164.5,324,[44]],[46,["number",{"value":4}],1164.5,355.5,[44]],[47,["note",{}],1077.5,418.5,[42,48,49,52]],[48,["number",{"value":6}],1149.5,418.5,[47]],[49,["pitch",{}],1091,450,[47,50,51,null]],[50,["solfege",{"value":"do"}],1164.5,450,[49]],[51,["number",{"value":4}],1164.5,481.5,[49]],[52,["note",{}],1077.5,544.5,[47,53,54,57]],[53,["number",{"value":12}],1149.5,544.5,[52]],[54,["pitch",{}],1091,576,[52,55,56,null]],[55,["solfege",{"value":"re"}],1164.5,576,[54]],[56,["number",{"value":4}],1164.5,607.5,[54]],[57,["note",{}],1077.5,670.5,[52,58,59,null]],[58,["number",{"value":4}],1149.5,670.5,[57]],[59,["pitch",{}],1091,702,[57,60,61,null]],[60,["solfege",{"value":"mi"}],1164.5,702,[59]],[61,["number",{"value":4}],1164.5,733.5,[59]],[62,["repeat",{}],157.5,496.5,[14,63,29,null]],[63,["number",{"value":12}],229.5,496.5,[62]],[64,["action",{"collapsed":true}],998,197,[null,65,66,null]],[65,["text",{"value":"chunk1"}],1092.5,206,[64]],[66,["note",{}],1011.5,237.5,[64,67,68,71]],[67,["number",{"value":6}],1083.5,237.5,[66]],[68,["pitch",{}],1025,269,[66,69,70,null]],[69,["solfege",{"value":"mi"}],1098.5,269,[68]],[70,["number",{"value":4}],1098.5,300.5,[68]],[71,["note",{}],1011.5,363.5,[66,72,73,76]],[72,["number",{"value":12}],1083.5,363.5,[71]],[73,["pitch",{}],1025,395,[71,74,75,null]],[74,["solfege",{"value":"re"}],1098.5,395,[73]],[75,["number",{"value":4}],1098.5,426.5,[73]],[76,["note",{}],1011.5,489.5,[71,77,78,81]],[77,["number",{"value":6}],1083.5,489.5,[76]],[78,["pitch",{}],1025,521,[76,79,80,null]],[79,["solfege",{"value":"mi"}],1098.5,521,[78]],[80,["number",{"value":4}],1098.5,552.5,[78]],[81,["note",{}],1011.5,615.5,[76,82,83,86]],[82,["number",{"value":12}],1083.5,615.5,[81]],[83,["pitch",{}],1025,647,[81,84,85,null]],[84,["solfege",{"value":"fa"}],1098.5,647,[83]],[85,["number",{"value":4}],1098.5,678.5,[83]],[86,["note",{}],1011.5,741.5,[81,87,88,null]],[87,["number",{"value":2}],1083.5,741.5,[86]],[88,["pitch",{}],1025,773,[86,89,90,null]],[89,["solfege",{"value":"sol"}],1098.5,773,[88]],[90,["number",{"value":4}],1098.5,804.5,[88]]]
[end .tb] 

Related pic

screenshot - 10222015 - 05-10-54 pm trying row row row your boat

Default Tempo

Right now, the tempo block, when used, changes the global tempo.

This is a little confusing b/c when it is removed, the new tempo still remains. Once removed, I expect the tempo to go back to default (Q = 90).

  1. A global tempo could be set, perhaps at the top of the screen in the UI.
  2. Then the tempo block could be used to alter the default (or global) tempo.

Devin

B# note played indefinately

Need to do more testing, but adding a B# in the way I did in the attached picture made an infinite playback of B# (but not the others).

  1. Could be the Note name input, specifically.
  2. Could be B# specifically

...actually, tested some other notes. Think the problem is the note name input.

screenshot - 10072015 - 08-34-10 am b generated by this makes an infinite drone

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.