All Projects → Okazari → Rythm.js

Okazari / Rythm.js

Licence: gpl-3.0
A javascript library that makes your page dance.

Programming Languages

javascript
184084 projects - #8 most used programming language
HTML
75241 projects

Projects that are alternatives of or similar to Rythm.js

Snapcast
Synchronous multiroom audio player
Stars: ✭ 4,028 (+7.27%)
Mutual labels:  audio, music
Lms
Lightweight Music Server. Access your self-hosted music using a web interface.
Stars: ✭ 315 (-91.61%)
Mutual labels:  audio, music
Soundspice Mobile
A light-weight and minimalist music player for Android
Stars: ✭ 289 (-92.3%)
Mutual labels:  audio, music
Pathephone Desktop
Distributed audio player
Stars: ✭ 240 (-93.61%)
Mutual labels:  audio, music
Canaree Music Player
Complete music player published in the Play Store. Heavily relies on Dagger, kotlin coroutines and Clean architecture.
Stars: ✭ 371 (-90.12%)
Mutual labels:  audio, music
Godot Mixing Desk
A complete audio solution for Godot 3.2.x, making procedural sound and adaptive/procedural music possible with a few nodes and a couple lines of code.
Stars: ✭ 240 (-93.61%)
Mutual labels:  audio, music
Lissajous
🎵 A tool for programmatic audio performance in the browser using Javascript.
Stars: ✭ 367 (-90.23%)
Mutual labels:  audio, music
Mimium
mimium (MInimal Musical medIUM) a programming language as an infrastructure for sound and music.
Stars: ✭ 212 (-94.35%)
Mutual labels:  audio, music
React Music Player
🎵 Maybe the best beautiful HTML5 responsive player component for react :)
Stars: ✭ 321 (-91.45%)
Mutual labels:  audio, music
Clubber
Application of music theory in audio reactive visualizations
Stars: ✭ 325 (-91.34%)
Mutual labels:  audio, music
Swift Radio Pro
Professional Radio Station App for iOS!
Stars: ✭ 2,644 (-29.59%)
Mutual labels:  audio, music
Awesome Music Production
A curated list of software, services and resources to create and distribute music.
Stars: ✭ 340 (-90.95%)
Mutual labels:  audio, music
Gwion
🎵 strongly-timed musical programming language
Stars: ✭ 235 (-93.74%)
Mutual labels:  audio, music
Gist
A C++ Library for Audio Analysis
Stars: ✭ 244 (-93.5%)
Mutual labels:  audio, music
Openmpt
Official read-only git mirror of the OpenMPT and libopenmpt subversion repository at https://source.openmpt.org/. This repository may occasionally get rebased without further notice when subversion revision properties (commit message) get fixed in recent history after the fact. Be sure to rebase often in case you clone or fork it.
Stars: ✭ 231 (-93.85%)
Mutual labels:  audio, music
Daisysp
A Powerful, Open Source DSP Library in C++
Stars: ✭ 291 (-92.25%)
Mutual labels:  audio, music
Discorddj
Discord DJ Bot. Play music in your server. Inspired by PlugDJ
Stars: ✭ 204 (-94.57%)
Mutual labels:  audio, music
Scdlbot
Telegram Bot for downloading MP3 rips of tracks/sets from SoundCloud, Bandcamp, YouTube with tags and artwork.
Stars: ✭ 210 (-94.41%)
Mutual labels:  audio, music
Sporth
A small stack-based audio language.
Stars: ✭ 325 (-91.34%)
Mutual labels:  audio, music
Powertabeditor
A cross-platform guitar tablature editor.
Stars: ✭ 334 (-91.11%)
Mutual labels:  audio, music

Contribute

<♫/> Rythm.js - v2.2.5

Build Status

Demo at: https://okazari.github.io/Rythm.js/

A JavaScript library that makes your page dance.

Getting started

Install with npm:

npm install rythm.js

Or get from a CDN:

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

Good old way

Import rythm into your page:

<script type="text/javascript" src="/path/to/rythm.min.js"></script>

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

<div class="rythm-bass"></div>

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

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

ES6 module

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

API documentation

Rythm object

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:

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.

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
/* 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:

/* 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:
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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].