Coder Social home page Coder Social logo

mtolly / onyx Goto Github PK

View Code? Open in Web Editor NEW
133.0 16.0 14.0 133.26 MB

Toolkit for converting and building songs for Rock Band, Guitar Hero, Clone Hero, and other similar rhythm games

Haskell 74.59% Makefile 0.09% JavaScript 0.37% HTML 1.02% Ruby 1.03% Logos 0.07% Yacc 0.30% Shell 0.45% PureScript 3.72% Python 0.08% C 14.42% C++ 1.74% CSS 0.03% Objective-C 0.01% RPC 0.07% Dockerfile 0.03% Sass 0.05% Mustache 0.08% GLSL 0.17% TeX 1.68%
music rock-band haskell purescript audio midi guitar-hero clone-hero game

onyx's Introduction

Onyx Music Game Toolkit

I transcribe songs for use in Harmonix's Rock Band 3 and other similar rhythm games. Along the way, I've written a helpful program to streamline the build process, and do all sorts of useful conversions and transformations.

Download from the releases page.

Screenshot of Onyx's song preview tool

Onyxite's Custom Songs

This repository contains the "source" for charts which (once finished) are available from my thread on the Customs Creators forum, or from my own website (work in progress).

Licensing

Creative Commons License GNU GPL License

The Onyx software is free software via the GNU GPL v3.

My transcriptions (not the compositions) are freely licensed under Creative Commons Attribution-ShareAlike. All compositions are the property of the original artists.

In addition to my own charts, this repository contains work by several other authors, including: Harmonix, Grinnz, mazegeek999, TheLieInKing, and more. (Credited in individual song READMEs.) Other authors' work hosted here is not necessarily licensed in the same way; please contact them if you want permission to redistribute or repackage charts.

onyx's People

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

onyx's Issues

Erotomania album version doesn't build on Magma

The timing of rolls is different between the album and Jammit tempo maps; Magma complains about them on both drums and bass for the album version (in the free-time outro).

Ideal solution would be automatic roll creation -- write long (longer than 0.25 beat?) drum notes in the MIDI, it gets turned into a (single or double) roll at a Magma-acceptable speed, and also with a roll end a few ticks after the last note's note-on (i.e. issue #10).

Online chart preview app

With GHCJS we could build a JS app that plays audio and uses Canvas or DOM to do a Magma-Reaper-plugin-like chart preview.

The audio should be super low quality, both for download speed and fair use conditions. The following seems to give a good result:

sox audio-album.* mono.wav remix 1,2
lame mono.wav -b 16

Check the lengths of album audio files

Should be able to specify the length (in samples) in the Yaml file, and then warn if it doesn't match the input file.

soxi -s file.ext prints out the number of samples.
I don't see an easy way to get a correct MP3 length out of LAME, but we can just use it to decode, and then use soxi.

Look into generating RB3Maker packages

RB3Maker supports a package format (<song>.rb3maker.zip) which automatically aligns a user's audio. This could be useful as a better distribution format, accounting for differently-padded MP3s and other oddities.

Refactor Makefiles to remove repetition, organize by audio format

Ideally, each song's Makefile should only have one line after the song-specific variable definitions:

include ../../make/<audio-format>.mk

where <audio-format> is something like drums or drums-keys which locks down which instruments are playable and the number of channels each one uses. Everything else should be done by that one .mk file.

Song testing and cleanup passes for v0.3

  • Test the 4 new songs (914, Another Dimension, Cockroach King, In Memoriam) on console
  • Mangini DT songs (Outcry [use drum guru video for solo], Enigma Machine, Lost Not Forgotten, This Is the Life) all need some cleanup work, also probably Blind Faith
  • Test Erotomania with bass

Compile to Magma

The user should be able to run

make gen/{audio}/{n}p/magma

and generate a folder with an .rbproj project, the notes.mid (cleaned of any extra events), and all the appropriate audio. The project should then be compilable by Harmonix's Magma (if under 10 minutes) or C3's edited Magma.

Compile to Frets on Fire & Phase Shift

The user should be able to run:

make gen/{audio}/{n}p/fof

and generate a folder with notes.mid, the audio as separate .ogg files (appropriately named), and a generated song.ini metadata file. The song would then be playable in Frets on Fire and Phase Shift.

Note that Phase Shift already looks for 2x Bass Pedal notes on pitch 95 and uses them to generate an Expert+ mode, so PS players should use 1p.

Fix roll lane lengths

A very small issue: the roll lane notes on pitches 126 and 127 should have their note-off event a very small amount of time (a few MIDI ticks) after the note-on of the last note in the roll. This was discussed in a Rock Band Creators forum thread, and is recommended by Harmonix authors as the right way to get a good-looking result in-game.

Auto-generate BEAT track if it doesn't exist

A BEAT track with a measure for each MIDI measure should be generated if there is none already. (If there is one already, just use that one.) The track should of course end at the [end] event.

Difficulty assignments

Plan is to write a small program to generate a rank based on analyzing the MIDI notes -- things like average note density, highest note density in a small section (to identiy solos/fills), most note changes in a small section, etc. This may involve curve-fitting based on the RB3 disc songs or some other chosen "reference ranks".

Interactive mode

In addition to the current make-like mode, you should be able to run onyxbuild path/to/song.yml or just run onyxbuild in a directory with song.yml, and get an interactive set of command-line menus that explain what products can be built, and what files are needed. The yo command-line program is the example we should follow.

Move all the artist folders into `songs/`

Hoping that <repo root>/*/*/README.md finds only songs and nothing else is starting to get ugly.

  • Repoint the Yaml references (song.yml which point to ../../albums/album-name.yml)
  • Edit any scripts which look for songs (should be cleaner)

Move all the old left foot notes from pitch 95 to 96

The build program now does all 1-pedal reductions itself, and moves pitch 95 notes to 96 at the start of the build process. This should be done manually on all the MIDIs so we can remove a few chunks of code from onyxbuild.

Switch between audio files via MIDI events

Guitar (#12) and keys (#14) charts using Jammit (or other multitrack) audio will depend on the ability to specify which of multiple audio files is currently being transcribed by a game part.

Also for LSDJ (#25) songs, the guitar/keys tracks will probably need to select between the two pulse wave channels. This same mechanism should probably also be used for the wave channel switching between bass and kick drum (but with the addition of some "automatic" mode to switch on note-on).

More Jammit audio features

  • Support drawing from multiple songs. This is needed for A Change of Seasons, The Mirror/Lie, etc.
  • Support audio expressions that reference individual stems, instead of blindly assigning each instrument the audio for all of its matching Jammit parts.
    • One tricky part is expressions that involve audio subtraction. For example, Erotomania has an organ bit that's not in the keyboard stem, but is rather in the backing tracks. To access it, you need all the instrument parts, and then it's -y D -n grbky. If you're missing any of them, it should just be rendered as silence. So, the audio expression would need a way to select what to do depending on what parts are present.

Game Boy (LSDJ) support

  • Get the existing Danimal Cannon song building with album audio
  • Allow the user to supply pre-aligned stems recorded with BGB or similar
  • Split the wave channel into bass and kick drum automatically via the MIDI notes
  • The dream: somehow embed a GB emulator in onyxbuild to record the stems automatically

Support for turning on/off MIDI events depending on audio configuration

This is primarily motivated by a desire to make a version of The Dark Eternal Night that uses the non-fade-out ending from Portnoy's DVD.
But it could also be used for e.g. that bit in Take the Time where the Greatest Hit version has drums over the bass chord, and the original IAW version does not.
Or, to support the Pull Me Under audio from GHWT which is cut off early.

Fix some rolls in Grinnz's charts

While testing Stream of Consciousness I noticed the intro/outro rolls don't cover their last note. In the original MIDI they end simultaneously with the last note-on, which means they're not actually covered with or without my roll-length-fixer.

Keys + pro keys charts

Plan: write a "full keyboard chart" (i.e. phase shift "real keys") to rb3 pro keys program, and a pro -> basic program.

Bass + pro bass charts

Plan: write a pro bass -> basic bass program. Might be easier than the guitar version?

Inconsistencies in 1-pedal reductions

Some double-kick patterns aren't reduced in a consistent way. An example is triplet patterns of the form:

<hands> <kick> <kick> <hands>

At slow speeds this can be left as is. Unfortunately, at fast speeds there are 3 ways this can be reduced:

  1. Only charting the first kick. This makes sense since it would usually be played with the dominant foot, which is what the 1-pedal chart should be, but is in my opinion awkward to play unless you "mime" the off foot note as well, and it looks somewhat ugly.
  2. Only charting the second kick. This looks and feels a bit better than option 1, but most people would play this note with their off foot, so it's inconsistent with how other common kick patterns are reduced.
  3. The Harmonix reduction, a kick right in the middle of the two "real" ones. See RB2's Panic Attack intro. This looks the nicest, but has the issue that the 1-pedal notes are no longer a subset of the 2-pedal notes. This is required for a Phase Shift MIDI with Expert and Expert+ modes, so it can't be done there. And, it would need another lane of notes to author (a "1-pedal only" lane in addition to the existing "2-pedal only" lane).

Option 1 is probably the most sensible, and aligns with the primary project goal of accuracy.

Automatic Pro Keys shifter/wrapper

Should take something resembling Phase Shift's "Real Keys" chart as an input, and produce a valid RB3 Pro Keys version by shifting and wrapping appropriately.

Use LAME library instead of external program

I've already started conduit-audio-lame, but it only encodes right now. Decoding looks more complicated; specifically there's a lot of gap-removal logic in the lame frontend that isn't in the actual libmp3lame.

Include mipmaps with .png_xbox

Currently it looks fine on the main song selection screen but then on the next screen (pick instrument) it's gibberish.

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.