Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Prototracker

Note: Prototracker is not the same thing as Prototracker-modular or Prototracker-OPLL. They have their own forks.

Prototracker is a multiplatform fakebit chiptune tracker. Try the online version.

The editor is a fairly normal tracker. The synth is an absolutely minimal single-oscillator synth (with 256 preset waveforms). Macros are used to create "instruments" and also some normal channel effects. Most keyboard shortcuts are the same as in Protracker. See the docs/ directory for help.

Supported platforms:

  • HTML5 (see the link above)
  • Windows (MinGW)
  • Linux
  • Mac (just use the Linux makefile)
  • Chip8 (runs great on a PocketCHIP)
  • Probably anything SDL2 supports

Building

Simply do make mingw where "mingw" is your platform of choice. Do make to see the supported platforms.

Building for OSX

To install SDL/SDL2 on OSX(using brew), type brew install sdl2 sdl sdl_image sdl_mixer sdl_ttf portmidi. If you are getting the fatal error: 'SDL_image.h' file not found error, type apt-get install libsdl2-image-dev. You should then be able to run make linux.

The binary needs the files in the assets/ directory to work properly.

Prototracker as a synth testbed

Prototracker was also created for testing audio/synth code (while having some minimal setup for a song structure), so it is quite easily extendable. Each of the channels runs an instance of ITrackState and IOscillator, and will simply extend IPlayer and ISynth to setup your own ITrackState (from IPlayer) and/or IOscillator (from ISynth).

The TrackState, Oscillator and Synth classes included (see src/) implement a minimal wavetable synth that has two extra track effects (W and Q). Since it's all per track, you can have each channel use a different set of effects and oscillators (think something like the audio capabilities of the NES). Just init the tracks in IPlayer::IPlayer() and ISynth::ISynth().

Releases

Packages

Contributors

Languages