Code Monkey home page Code Monkey logo

juceoplvsti's Introduction

OPL VST plugin

This VST instrument provides an emulated OPL sound chip. It provides all features of the OPL2, and some features of the OPL3.

See here for binaries, screenshots etc: http://bsutherland.github.io/JuceOPLVSTi/

What's an OPL?

The OPL is a digital sound synthesis chip developed by Yamaha in the mid 1980s. Among other products, it was used in sound cards for PC, including the Ad Lib card and early Sound Blaster series.

At a technical level: the emulator has channels comprised of 2 oscillators each. Each pair of oscillators is usually combined via phase modulation (basically frequency modulation). Each oscillator can produce one of eight waveforms (sine, half sine, absolute sine, quarter sine, alternating sine, camel sine, square, logarithmic sawtooth), and has an ADSR envelope controlling its amplitude. The unusual waveforms give it a characteristic sound.

Caveats and Limitations

Before I wrote this, I didn't know much about VST or the OPL at a technical level. This is the first VST plugin I've written. In hindsight I would have implemented things a bit differently, but it all basically works, and is now reasonably well tested.

One thing I have learned is that all VST hosts are not created equal. I only really work with Renoise. Your mileage may vary.

Note that I started and work on this project for fun. I'm not accepting donations, but any contributions in the form of code, SBI files, links to music you've created etc are very welcome and help keep me motivated.

Please also understand that I also write software full time for a living and have a life outside of software development.

How do I use it?

Each instance of the plugin emulates an entire OPL chip, but with this plugin, essentially you are just working with two operators: the carrier and modulator.

Some documentation which may be useful:

What can it do?

Here are some examples:

SBI FIles

SBI files are an instrument file format developed by Creative Labs back in the day for the Sound Blaster. Essentially they work as presets for this plugin. Just drag and drop them into the plugin window!

I've collected a bunch of presets in this repository. I've also added support for saving SBI files. Please contribute!

It's possible to extract SBI instruments from games using DOSBox 0.7.2 and DRO2MIDI by Malvineous.

  1. Run the game in DOSBox.
  2. Start capturing OPL output with ctrl+alt+F7. Output will be recorded to a .dro file.
  3. Run DRO2MIDI: dro2midi -s input_capture.dro output_midi.mid

Note data will be extracted to .mid, instruments will be extracted to .sbi files.

Percussion

Percussion mode is now supported! This mode is not very well documented, even in the original Yamaha documentation. Here are some tips on using it based on experimentation and looking at the DOSBox source code.

  • Bass drum: Uses both operators. Essentially just doubles output amplitude?
  • Snare: Uses carrier settings. Abs-sine waveform recommended.
  • Tom: Uses modulator settings. Sine waveform recommended.
  • Cymbal: Uses carrier settings. Half-sine recommended.
  • Hi-hat: Uses modulator settings. Half-sine recommended.

Also, some much more detailed notes on percussion mode based on experimentation with real hardware!

How did you create the instrument programs?

To figure out the parameters used by the original games, I just added a printf to the DOSBox OPL emulator, compiled DOSBox, ran the games, and captured their output as raw register writes with timestamps.

I hacked together a Python script which parses the raw output, identifying unique instruments and outputting the parameter values.

How did you create this?

The emulation (ie, the hard part!) is taken straight from the excellent DOSBox project. I also used a function from libgamemusic by Adam Nielsen for converting frequencies from Hertz into the "FNUM" values used by the OPL.

The VST was written using Juce, a cross-platform C++ library inspired by the Java JDK. Among other things, Juce provides a GUI for generating boilerplate for audio plugins.

The code I wrote is essentially a device driver for the emulated OPL, implementing the VST interface, and providing a UI.

Building

So far I've only built under Windows. Thanks to the hard work of Jeff Russ, there is also an OSX build, but I currently have no way to build it myself on OSX..

Windows Build Instructions

  1. Download Juce (http://www.juce.com/)
  2. Download the VST SDK (http://www.steinberg.net/en/company/developers.html)
  3. Run "The Projucer" executable included in Juce.
  4. Open JuceOPLVSTi.jucer
    • Make any changes to the GUI layout and components here (PluginEditor.cpp).
    • Save PluginEditor.cpp if modified
  5. Hit "Save Project and Open in Visual Studio". I use Visual Studio Express 2015.
  6. Select the build: "Release - 64-bit" and set platform to x64.
  7. (Optional, for Windows XP compatibility) In the project's properties, set platform toolset to Windows XP (Configuration Properties > General).
  8. Build!

Linux Build Instructions

Thanks to Dave Phillips. See original instructions here: https://www.linuxmusicians.com/viewtopic.php?f=19&t=15485

  1. Download Juce (http://www.juce.com)
  2. Download the VST SDK (http://www.steinberg.net/en/company/developers.html)
  3. Open JuceOPLVSTi.jucer in the Introjucer application.
    • Right click on the JuceOPLVSTi label in the file tree.
    • Select "Create Linux Makefile Target".
    • Open the juce_audio_basics module. Set paths and/or update all other Juce modules as required.
    • Click on the Linux Makefile label and set the location of the VST SDK.
  4. Make. Output at Builds/LinuxMakefile/build/JuceOPLVSTi.so

juceoplvsti's People

Contributors

bsutherland avatar jeff-russ avatar trylle avatar rowedonalde avatar

Watchers

James Cloos avatar  avatar

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.