Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/okazari/rythm.js

A javascript library that makes your page dance.
https://github.com/okazari/rythm.js

audio dance javascript music page-dancing pulse rythm web

Last synced: 29 days ago
JSON representation

A javascript library that makes your page dance.

Awesome Lists containing this project

README

        

# Contribute

<♫/> Rythm.js - v2.2.6
======================

[![Build Status](https://travis-ci.org/Okazari/Rythm.js.svg?branch=master)](https://travis-ci.org/Okazari/Rythm.js)

Demo at: [https://okazari.github.io/Rythm.js/](https://okazari.github.io/Rythm.js/)

A JavaScript library that makes your page dance.

Getting started
===============

Install with npm:

```sh
npm install rythm.js
```

Or get from a CDN:

```
https://unpkg.com/rythm.js/
https://cdnjs.cloudflare.com/ajax/libs/rythm.js/2.2.6/rythm.min.js
```

Good old way
------------

Import rythm into your page:

```html

```

Add one of the rythm css classes to indicate which element will dance:

```html


```

Create a rythm object and give it your audio URL then use the start function:

```js
var rythm = new Rythm()
rythm.setMusic('path/to/sample.mp3')
rythm.start()
```

ES6 module
----------

```js
import Rythm from 'rythm.js'
const rythm = new Rythm()
rythm.setMusic('path/to/sample.mp3')
rythm.start()
```

API documentation
=================

Rythm object
------------

```js
const rythm = new Rythm()

/* The starting scale is the minimum scale your element will take (Scale ratio is startingScale + (pulseRatio * currentPulse)).
* Value in percentage between 0 and 1
* Default: 0.75
*/
rythm.startingScale = value

/* The pulse ratio is be the maximum additional scale your element will take (Scale ratio is startingScale + (pulseRatio * currentPulse)).
* Value in percentage between 0 and 1
* Default: 0.30
*/
rythm.pulseRatio = value

/* The max value history represent the number of passed value that will be stored to evaluate the current pulse.
* Int value, minimum 1
* Default: 100
*/
rythm.maxValueHistory = value

/* Set the music the page will dance to
* @audioUrl: '../example/mysong.mp3'
*/
rythm.setMusic(audioUrl)

/* Used to collaborate with other players library.
* You can connect Rythm to an audioElement, and then control the audio with your other player
*/
rythm.connectExternalAudioElement(audioElement)

/* Adjust audio gain
* @value: Number
*/
rythm.setGain(value)

/* Add your own rythm-class
* @elementClass: Class that you want to link your rythm to
* @danceType: Use any of the built-in effect or give your own function
* @startValue: The starting frequency of your rythm
* @nbValue: The number of frequency of your rythm
* 1024 Frequencies, your rythm will react to the average of your selected frequencies.
* Examples: bass 0-10 ; medium 150-40 ; high 500-100
*/
rythm.addRythm(elementClass, danceType, startValue, nbValue)

/* Plug your computer microphone to rythm.js.
* This function returns a Promise object that is resolved when the microphone is up.
* Require your website to be run in HTTPS
*/
rythm.plugMicrophone().then(function(){...})

// Let's dance
rythm.start()

/* Stop the party
* @freeze: Set this to true if you want to prevent the elements to reset to their initial position
*/
rythm.stop(freeze)
```

Built-in classes with "pulse" effect
------------------------------------

+ rythm-bass
+ rythm-medium
+ rythm-high

Custom-classes
--------------

You can use the `addRythm` function to make your own classes listen to specific frequencies.
Here is how the basics classes are created:
+ `addRythm('rythm-bass', 'pulse', 0, 10)`
+ `addRythm('rythm-medium', 'pulse', 150, 40)`
+ `addRythm('rythm-high', 'pulse', 500, 100)`

Dance types available
---------------------

For more control of theses dance types, you can give a configuration object as last argument to `addRythm`:

```js
addRythm('rythm-high', 'shake', 500, 100, { direction:'left', min: 20, max: 300 })
```

Here are the built-in dances and their options:
+ pulse
+ min: Minimum value given to `transform: scale()`. Default: `0.75`
+ max: Maximum value given to `transform: scale()`. Default: `1.25`
+ jump
+ min: Minimum value given to `transform: translateY()`. Default: `0`
+ max: Maximum value given to `transform: translateY()`. Default: `30`
+ shake
+ min: Minimum value given to `transform: translateX()`. Default: `-15`
+ max: Maximum value given to `transform: translateX()`. Default: `15`
+ direction: `left` for a right to left move, `right` for a left to right move. Default: `right`
+ twist
+ min: Minimum value given to `transform: rotate()`. Default: `-20`
+ max: Maximum value given to `transform: rotate()`. Default: `20`
+ direction: `left` for a right to left move, `right` for a left to right move. Default: `right`
+ vanish
+ min: Minimum value (between 0 and 1) given to `opacity`. Default: `0`
+ max: Maximum value (between 0 and 1) given to `opacity`. Default: `1`
+ reverse: Boolean to reverse the effect. Default: `false` (Higher the pulse is, the more visible it will be)
+ borderColor
+ from: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[0,0,0]`
+ to: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[255,255,255]`
+ color
+ from: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[0,0,0]`
+ to: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[255,255,255]`
+ radius
+ min: Minimum value given to `border-radius`. Default: `0`
+ max: Maximum value given to `border-radius`. Default: `25`
+ reverse: Boolean to make effect from max to min. Default: `false`
+ blur
+ min: Minimum value given to `filter: blur()`. Default: `0`
+ max: Maximum value given to `filter: blur()`. Default: `8`
+ reverse: Boolean to make effect from max to min. Default: `false`
+ swing
+ curve: Whether the element should curve `up` or `down`. Default: `down`
+ direction: Whether the element should swing `right` or `left`. Default: `right`
+ radius: How far the element will swing. Default: `20`
+ kern
+ min: Minimum value given to `letter-spacing`. Default: `0`
+ max: Maximum value given to `letter-spacing`. Default: `25`
+ reverse: Boolean to make effect from max to min. Default: `false`
+ neon
+ from: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[0,0,0]`
+ to: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[255,255,255]`
+ borderWidth
+ min: Minimum value given to `border-width`. Default: `0`
+ max: Maximum value given to `border-width`. Default: `5`
+ fontSize
+ min: Minimum value given to `font-width`. Default: `0.8`
+ max: Maximum value given to `font-width`. Default: `1.2`
+ tilt
+ min: Minimum value given to `tilt`. Default: `20`
+ max: Maximum value given to `tilt`. Default: `25`
+ reverse: Boolean to make effect from max to min. Default: `false`
+ fontColor
+ from: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[0,0,0]`
+ to: Array of integer between 0 and 255 corresponding to a RGB color. Default: `[255,255,255]`

To see each visual effect, you can go to the [Demo](https://okazari.github.io/Rythm.js/).

Custom dance type
-----------------

If you want to use your own dance type, you need to give an object as the 2nd argument of `addRythm` instead of a built in dance key.

This object must have two properties:
- dance: The custom function to make elements dance
- reset: The associated custom function that will be called to reset element style

```js
/* The custom function signature is
* @elem: The HTML element target you want to apply your effect to
* @value: The current pulse ratio (percentage between 0 and 1)
* @options: The option object user can give as last argument of addRythm function
*/
const pulse = (elem, value, options = {}) => {
const max = options.max || 1.25
const min = options.min || 0.75
const scale = (max - min) * value
elem.style.transform = `scale(${min + scale})`
}

/* The reset function signature is
* @elem: The element to reset
*/
const resetPulse = elem => {
elem.style.transform = ''
}

addRythm('my-css-class', { dance: pulse, reset: resetPulse }, 150, 40)
```

Features
========

+ Your HTML can dance by using any of the available dance types.
+ You can use custom functions to build you own dance type (and if it looks awesome! Feel free to make a PR ;) )

Contribute
==========

Any pull request will be appreciated. You can start coding on this project following these steps:
+ Fork the project
+ Clone your repository
+ Run ```npm install```
+ Run ```npm start``` in the main folder to launch a development web server
+ Enjoy the rythm

Adding new dance type
---------------------

In v2.2.x adding a new dance type is pretty easy:
+ Create a new file in `src\dances`
+ This file must export your custom dance type function
+ This file must export a reset function

For example, here is the content of `jump.js` file:

```js
/* The function signature is
* @elem: The HTML element target you want to apply your effect to
* @value: The current pulse ratio (percentage between 0 and 1)
* @options: The option object user can give as last argument of addRythm function
*/
export default (elem, value, options = {}) => {
const max = options.max || 30
const min = options.min || 0
const jump = (max - min) * value
elem.style.transform = `translateY(${-jump}px)`
}

/* The reset function signature is
* @elem: The element to reset
*/
export const reset = elem => {
elem.style.transform = ''
}
```

+ Import it and register it into the constructor of `Dancer.js` file:

```js
import jump, { reset as resetJump } from './dances/jump.js'
class Dancer {
constructor() {
this.registerDance('jump', jump, resetJump)
}
}
```

+ Commit it and create a PR. Then look at everyone enjoying your contribution :) !

License: GNU GPL

Author: [@OkazariBzh](https://twitter.com/OkazariBzh)