Git Product home page Git Product logo

_2dnote's Introduction

_2DNote: 2D Note Generator GitHub package version License: MIT

Live Demo

Include in HTML

API

Purpose: An experiment in making visual interfaces more accessible to people who are blind. Screen readers linearize your page content, so they don't communicate 2-dimensional visuals very well. You can address that by mapping 2D positions to notes.

Potential Uses: Create 2D games and apps that people can use together, regardless of vision capabilities? Hear the contours of your signature as you write it? Enable people to "hear" what someone else is drawing? Locate elements on a page? Convert graphs into sound? Etc.

Some Design Choices: _2DNote does not rely on binaural audio, so devices with only 1 speaker can still communicate the 2D position of one or more elements simultaneously. It does that by relying on volume and pitch. Brain plasticity will take care of the rest.

You can think of the y dimension as the "proximity dimension" (louder = closer to you), and the x dimension as the "piano dimension" (left-to-right = low-to-high notes).

_2DNote.js is made from pure "vanilla" JavaScript. So no special install steps required. ๐Ÿ˜„

To keep things as flexible as possible, you'll need to handle keyboard-only interaction. That said, you might be interested in hchiam/draggable, which focuses on letting you moving elements around with mouse, touch, keyboard, or screen reader!

Further reading

https://codepen.io/hchiam/full/eYYdVeX

(You can live edit the demo code in real time here: https://codepen.io/hchiam/pen/eYYdVeX)

Can I include it in my own HTML code?

Yes:

<script
  src="https://cdn.jsdelivr.net/gh/hchiam/[email protected]/_2DNote.min.js"
  integrity="sha384-e0d2dNwg3F9WTJ3jZBF5iUeuVyAtx+zwMnCAvKMiCHtwO2l2dzo3cIMO4+Xqwn5p"
  crossorigin="anonymous"
></script>

While not recommended, you can auto-update to the latest by linking the src to:

  • https://cdn.jsdelivr.net/gh/hchiam/_2DNote@master/_2DNote.min.js or
  • https://cdn.jsdelivr.net/gh/hchiam/_2DNote@latest/_2DNote.min.js

By including _2DNote.js, you get an object _2DNote, which you can use in your HTML or JS code.

For example:

<div onmousemove="_2DNote.update(event,colourSoundIcon);">...</div>

For quick setup on the body tag:

<body>
  <script
    src="https://cdn.jsdelivr.net/gh/hchiam/[email protected]/_2DNote.min.js"
    integrity="sha384-e0d2dNwg3F9WTJ3jZBF5iUeuVyAtx+zwMnCAvKMiCHtwO2l2dzo3cIMO4+Xqwn5p"
    crossorigin="anonymous"
  ></script>
  <script>
    _2DNote.setAs2DArea(document.body, callbackUponUpdate);
    function callbackUponUpdate() {
      // do something whenever _2DNote.update() is triggered;
    }
  </script>
</body>

For quick setup of a custom 2D click/touch area:

<body>
  <div id="2d-area" style="width: 100vw; height: 100vh;">...</div>
  ...
  <script
    src="https://cdn.jsdelivr.net/gh/hchiam/[email protected]/_2DNote.min.js"
    integrity="sha384-e0d2dNwg3F9WTJ3jZBF5iUeuVyAtx+zwMnCAvKMiCHtwO2l2dzo3cIMO4+Xqwn5p"
    crossorigin="anonymous"
  ></script>
  <script>
    _2DNote.setAs2DArea(document.getElementById("2d-area"), callbackUponUpdate);
    function callbackUponUpdate() {
      // do something whenever _2DNote.update() is triggered;
    }
  </script>
</body>

To disable the "exit" sound:

var useExitDetection = false;

_2DNote.setAs2DArea(
  document.querySelector("#your_element"),
  callbackUponUpdate,
  useExitDetection
);

For a full working code example, see example-include.html

Here's an example of 2 notes playing simultaneously: example-two-notes.html

API

The things you're most likely to use are: .play(e), .update(e), .stop(), and .copy().

(Full details in _2DNote.js.)

_2DNote.audioContext:

  • This is the AudioContext used by the _2DNote instance to do the work of actually creating the note.

_2DNote.note:

  • This holds the information about the note (oscillator, volumeSetup) that the _2DNote instance can play.

_2DNote.play(e, setupExitDetection = true):

  • This plays a note based on the position of the element or mouse click event, which it figures out for you. (e is for event or element.)
  • setupExitDetection is an optional parameter, and is true by default. You most likely will want to do either _2DNote.play(e) or _2DNote.play(e, false). This parameter tells _2DNote whether it should play an "exit" sound when you leave the 2D area.
  • Note: The note automatically stops playing if the cursor moves outside the window. This avoids having users click something outside the window without realizing it.
  • UX reminder: If you plan to use _2DNote in only one area of the page, you should let users know when the cursor moves outside of that area. To do that, try something like <tag-name onmouseleave="_2DNote.stop();"> on the enclosing HTML element tag. See example-include.html or example-two-notes.html for examples placed on the body tag. If you'd like to disable the warnExitedView when the mouse leaves the body, then you can run document.body.removeEventListener("mouseleave",_2DNote.warnExitedView);

_2DNote.update(e) or _2DNote.update(e, callback):

  • This causes the note that the _2DNote instance is playing to update to the current position of the element or mouse click event, which it figures out for you. (e is for event or element.)
  • callback is an optional parameter, and is a function that will be run from within update() with this signature: callback(volume, frequency, pan). See full details in _2DNote.js. See usage example in example-include.html or example-two-notes.html.

_2DNote.stop():

  • This stops the note that the _2DNote instance is currently playing.

_2DNote.copy():

  • This returns a deep clone of the _2DNote instance. Extra instances make it more convenient to play multiple notes at the same time.

_2DNote.getFrequency(e):

  • This returns the note frequency based on the x coordinate of the element or mouse click event, which it figures out for you. (e is for event or element.)

_2DNote.getVolume(e):

  • This returns the note volume based on the y coordinate of the element or mouse click event, which it figures out for you. (e is for event or element.)

_2DNote.getPan(e):

  • This returns the note panning based on the x coordinate of the element or mouse click event, which it figures out for you. (e is for event or element.) Panning creates binaural audio: if you use headphones, it'll sound like the audio is coming from the left or right side of you.

_2DNote.normalize(value, inputRange, outputRange):

  • This maps the value found within the input range ([inputRangeMin, inputRangeMax]) to be in the chosen output range ([outputRangeMin, outputRangeMax]). It returns the re-mapped value.

Older version also available on NPM

(But I'd just stick to the GitHub package version.)

https://www.npmjs.com/package/2dnote

npm i 2dnote

See the notes in this example to publish to both GitHub packages page and npm packages page: https://github.com/hchiam/generator-hchiam-learning/commit/f3bbdfa93ae7c27e8d32b04f587afc644048e486 (But I'd just stick to the GitHub package version.)

If you're interested in general accessibility

https://github.com/hchiam/web-accessibility-course-notes#web-accessibility-a11y-course-notes

Other accessibility-related repos

https://github.com/hchiam/flying-focus

https://github.com/hchiam/keyboard-focus-trap

https://github.com/hchiam/draggable

Local development

bash package.sh
# do this first:
yarn publish # supply new version number in CLI

# do this second:
yarn package

_2dnote's People

Contributors

hchiam avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

fraugdib

_2dnote's Issues

make HTML setup easier and less bulky

Make it convenient for developers to add functionality (and hence more likely to adopt):

INITIAL IDEA: Just use onload to auto-add listeners on these 8 properties: onmousedown, omouseup, onmouseleave, ontouchstart, onmousemove, ontouchmove, ontouchend, and ontouchcancel.

<div onload="_2DNote.setAs2DArea(this)">
...
</div>

enable+test dragging on mobile

    • touchstart, touchend, touchmove
    • mousedown, mouseup, mousemove
    • don't use onclick -> this means replacing playOrStop(event)

add more rationale/background/context

update documentation: reason not relying on binaural audio? So that even devices with one speaker can express location in 2D, even of multiple simultaneous notes.

Enable drawing and maybe even hearing contours of sketches.

implement and test recommended pointer events > touch+mouse

https://developers.google.com/web/fundamentals/design-and-ux/input/touch#add_event_listeners

// Check if pointer events are supported.
if (window.PointerEvent) {
  // Add Pointer Event Listener
  swipeFrontElement.addEventListener('pointerdown', this.handleGestureStart, true);
  swipeFrontElement.addEventListener('pointermove', this.handleGestureMove, true);
  swipeFrontElement.addEventListener('pointerup', this.handleGestureEnd, true);
  swipeFrontElement.addEventListener('pointercancel', this.handleGestureEnd, true);
} else {
  // Add Touch Listener
  swipeFrontElement.addEventListener('touchstart', this.handleGestureStart, true);
  swipeFrontElement.addEventListener('touchmove', this.handleGestureMove, true);
  swipeFrontElement.addEventListener('touchend', this.handleGestureEnd, true);
  swipeFrontElement.addEventListener('touchcancel', this.handleGestureEnd, true);

  // Add Mouse Listener
  swipeFrontElement.addEventListener('mousedown', this.handleGestureStart, true);
}

Add modular .js file for easy use in other projects

  • Avoid collisions by encapsulating variables and functions: Object? IIFE?
  • Make it easy to use in other projects: Add include link to README.md: people can pull the code from github using jsdelivr and include it in their HTML like <script src='...'></script>

information architecture of my repo

    • Do #11 first before step 3).
    • Icon that communicates 2d space to notes. For the blind. For devs to use in their HTML.
    • Share to get feedback from developers, who are my target audience to then help the blind.

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.