Giter VIP home page Giter VIP logo

bambootracker's Introduction

BambooTracker-icon

BambooTracker

BambooTracker Version Number (autogenerated image) BambooTracker Platforms: Windows, macOS, Linux, BSD BambooTracker License: GPL-2.0 or later
[Build Tests]
BambooTracker Build-Test Status on Windows (Qt6) BambooTracker Build-Test Status on macOS BambooTracker Build-Test Status on Linux (Ubuntu) BambooTracker Build-Test Status on Linux (Nixpkgs) BambooTracker Development-Build Status
English | 日本語

BambooTracker is a cross-platform music tracker for the Yamaha YM2608 (OPNA) sound chip which was used in NEC PC-8801/9801 series computers.

Table of Contents

  1. Wiki
  2. Community
  3. Translations
  4. Downloads
    4.1. Releases (Windows, macOS, Linux)
    4.2. Development Builds (Windows, macOS)
    4.3. Packages (macOS, Linux, BSD)
  5. Key Commands
  6. Effect List
  7. File I/O
  8. Building
    8.1. Dependencies
    8.2. Compilation
  9. Changelog
  10. License
  11. Credits

Wiki

On the BambooTracker GitHub Wiki, you can find some more details on:

  • what a Tracker is
  • what BambooTracker is & what it supports
  • how to navigate & use BambooTracker's interface
  • how to control the Yamaha YM2608 sound chip in the context of BambooTracker

Community

We have an official Discord server where you can chat with BambooTracker users, developers and package maintainers, ask for help, help others and share your tunes on.

Translations

BambooTracker currently supports the following languages:

  • English (default)
  • 日本語 / Japanese
  • Français / French
  • Polski / Polish
  • Español / Spanish

If you'd like to see your language of choice added to the list, join the Discord server and let us know! We can walk you through the steps required to set up the translation tool.

Downloads

Releases (Windows, macOS, Linux)

Releases are recommended for most users, as they should provide a good & stable experience.

Release

Development Builds (Windows, macOS)

Development builds are built & uploaded whenever a code change has been committed to the base repository or a pull request. They thus offer the latest or in-development features and fixes, but are not optimised for regular use.

Development Build

  • If you're looking for

    • the latest merged commit, make sure ONLY
      master -o- (some numbers & letters)
      is displayed at the top instead of
      master -o- (some numbers & letters) ← in_development-bugfix (some numbers & letters)
    • a specific Pull Request, make sure that it says
      Pull request #(Pull Request ID)
      in the top left

    ... otherwise check the History tab to find whichever of those you need.

  • In the "Job name" column, find the row that says APPVEYOR_JOB_NAME=for (your OS) and click on it.

  • On the new page, click on the Artifacts tab on the right to get to the download page.

Packages (macOS, Linux, BSD)

Packaging status

Nixpkgs (macOS, Linux)

Nixpkgs package: https://search.nixos.org/packages?query=bambootracker

Declarative installation:

{
  environment.systemPackages = with pkgs; [
    bambootracker
  ];
}

Imperative installation:

nix-env -iA nixpkgs.bambootracker

Debian / Ubuntu

sudo apt install bambootracker

Arch / Manjaro

AUR package: https://aur.archlinux.org/packages/bambootracker-git/

FreeBSD

pkg install bambootracker

Other

See Building

Key Commands

See KEYCOMMANDS.md.

Effect List

See EFFECTLIST.md.

File I/O

See FILEIO.md.

Building

Dependencies

To build BambooTracker, you'll need the following dependencies across all platforms:

  • Qt (5.5 or higher)
  • Qt Tools (qmake, lrelease, ...)
  • A Qt-supported C++ compiler (GCC, Clang, MSVC, ...)
  • make

How to acquire these and further required / optional dependencies are specific to your OS (distribution).

Windows

  • C++ compiler: You can use either of these options
    • MinGW
      Should be a bundled option in the Qt installer.
      Otherwise check the Qt docs for your Qt version's compatible GCC version.
    • Clang
      Untested but might work.
    • MSVC
      Either bundled with Visual Studio or standalone (check "Build Tools for Visual Studio 2019" download).
  • Qt: Older Qt versions (e.g. for an XP builds) may require you to checkout & compile Qt yourself, official prebuilt versions were removed by Qt.

macOS

For simplicity, these instructions assume the use of Homebrew & Qt5.

  • C++ compiler: Xcode Command Line Tools
    The challenge of acquiring these is left to the reader.
    (The developer writing this doesn't use macOS, try looking on the web for a guide perhaps)
  • Qt5:
brew install qt5

Optional dependencies:

  • JACK: Support for connecting to a JACK server in vendored RtAudio / RtMidi.
    Requires JACK (version 1 or 2) headers & libraries.

    brew install jack

    Optional: pkg-config, can be skipped but may make finding JACK headers & libraries harder.

    brew install pkg-config
  • RtAudio / RtMidi: Use a precompiled RtAudio / RtMidi installation instead of our vendored one.
    (Obsoletes the optional dependencies above)
    Requires RtAudio (5.1.0 or higher) and/or RtMidi (4.0.0 or higher) + pkg-config.

    brew install rt-audio rt-midi pkg-config

Linux

Installing dependencies highly depends on your distribution and package manager of choice, search the subsections below for your distribution to find a tested set of install instructions.

Additional dependencies:

  • ALSA: Required for minimal audio & MIDI support.
    Requires ALSA headers & libraries.

Optional dependencies:

  • PulseAudio: Support for connecting to a PulseAudio server in vendored RtAudio.
    Requires PulseAudio headers & libraries.
    Optional: pkg-config, can be skipped but may make finding PulseAudio headers & libraries harder.
  • JACK: Support for connecting to a JACK server in vendored RtAudio / RtMidi.
    Requires JACK (version 1 or 2) headers & libraries.
    Optional: pkg-config, can be skipped but may make finding JACK headers & libraries harder.
  • RtAudio / RtMidi: Use a precompiled RtAudio / RtMidi installation instead of our vendored one.
    (Obsoletes the optional dependencies above)
    Requires RtAudio (5.1.0 or higher) and/or RtMidi (4.0.0 or higher) + pkg-config.
Debian / Ubuntu
# Optional dependencies
OPTIONALDEPS=""

# PulseAudio
OPTIONALDEPS="$OPTIONALDEPS libpulse-dev"

# Either:
# JACK 1
OPTIONALDEPS="$OPTIONALDEPS libjack-dev"
# JACK 2
OPTIONALDEPS="$OPTIONALDEPS libjack-jackd2-dev"

# Either / Both:
# System-RtAudio
OPTIONALDEPS="$OPTIONALDEPS librtaudio-dev"
# System-RtMidi
OPTIONALDEPS="$OPTIONALDEPS librtmidi-dev"

# Install dependencies
apt install \
  build-essential \
  qt5-default qttools5-dev-tools \
  libasound2-dev \
  $OPTIONALDEPS
Arch Linux / Manjaro
# Optional dependencies
OPTIONALDEPS=""

# PulseAudio
OPTIONALDEPS="$OPTIONALDEPS libpulse"

# Either:
# JACK 1
OPTIONALDEPS="$OPTIONALDEPS jack"
# JACK 2
OPTIONALDEPS="$OPTIONALDEPS jack2"

# Either / Both:
# System-RtAudio
OPTIONALDEPS="$OPTIONALDEPS rtaudio"
# System-RtMidi
OPTIONALDEPS="$OPTIONALDEPS rtmidi"

# Install dependencies
pacman -S \
  qt5-tools \
  alsa-plugins \
  $OPTIONALDEPS

BSD

Mostly like Linux:

  • ALSA is optional
  • OSS4 headers & libraries is required instead

If you managed to get BambooTracker manually compiled on a BSD system, feel free to open a Pull Request and add your dependency install instructions here!

Compilation

These compilation instructions assume CLI usage, though it's possible to use an IDE like Qt Creator instead. They should generally work on all platforms, specific changes are mentioned in the subsections below.

Qmake options (flags/switches):

  • PREFIX: Where to install the completed build.
    Default:
    • Windows: C:\BambooTracker
    • macOS/Linux/BSD: /usr/local
      Example: PREFIX=C:\Users\Owner\Programs\BambooTracker
  • CONFIG
    Can be specified multiple times to add multiple options.
    Use += to add & -= to remove an option.
    • debug: A debug build, may be helpful for debugging crashes.
    • release: A release build, more optimised & slimmer than a debug one.
    • install_flat: Don't use Linux FHS paths under PREFIX during installation. (Default on Windows)
    • install_minimal: Skip installation of non-essential files.
    • use_alsa: Compile vendored RtAudio & RtMidi with explicit support for ALSA1. (Default on Linux)
    • use_oss: Compile with explicit support for OSS42. (Default on BSD)
    • use_pulse: Compile vendored RtAudio with explicit support for PulseAudio1.
    • use_jack: Compile with explicit support for JACK 1/213.
    • system_rtaudio: Skips RtAudio compilation and links against the system's RtAudio installation instead.
    • system_rtmidi: Skips RtMidi compilation and links against the system's RtMidi installation instead.
    • real_chip: Compile with support for SCCI and C86CTL interfaces to a real OPNA chip4. (Default on Windows)

1: Only works on Linux and BSD.
2: Shipped & auto-detected(?) on FreeBSD but possibly not functional in RtAudio.
3: API technically supported on Windows but unlikely to compile in Rt library.
4: Builds code that doesn't use an OSI-certified license. Only supported on Windows.

Example:

# Where you want to locally keep the source code clone
cd /home/owner/devel

# Replace --recurse-submodules with --recurse-submodules=submodules/emu2149/src if CONFIG+=system_rtaudio AND CONFIG+=system_rtmidi will be used
git clone https://github.com/BambooTracker/BambooTracker --recurse-submodules
cd BambooTracker

# Configure
qmake PREFIX=/usr/local CONFIG-=debug CONFIG+=release CONFIG+=use_alsa CONFIG+=use_pulse CONFIG+=use_jack

# Recursively initialises subprojects properly, dependency tests may be flakey if run multithreaded
make qmake_all

# Compile with 4 threads
make -j4

# Installs to PREFIX
make install

Windows

Enter a shell with Qt + your compiler set up before starting the above steps. (Qt installer adds scripts you can use for this)

  • If you're using MinGW, use mingw32-make / mingw64-make instead of make.
  • If you're using MSVC, TODO.

Qt Creator may be used for a more graphical compilation process instead.

macOS

If you decided to use Homebrew's JACK without pkg-config, you may need to help the build process out by passing qmake some additional arguments: LIBS+=-L/usr/local/opt/jack/lib INCLUDEPATH+=/usr/local/opt/jack/include.

FreeBSD

BambooTracker can be built via FreeBSD ports instead:

cd /usr/ports/audio/bambootracker
make install clean

Changelog

See CHANGELOG.md.

License

This program and its source code are licensed under the GNU General License Version 2 or later.

See LICENSE and licenses/list.md for details.

Credits

I would like to thank the following people for making it:

  • Qt team for Qt framework
  • Tatsuyuki Satoh, Jarek Burczynski and Valley Bell for the codes of MAME YM2608 chip emulation
  • Digital Sound Antiques for emu2149
  • Decidetto for the application icon
  • Mark James for Silk icons used for some other icons
  • VGMRips team for the VGM file format documentation
  • Some tracker creators, especially HertzDevil of 0CC-FamiTracker, Leonardo Demartino (delek) of Deflemask Tracker, Lasse Öörni (Cadaver) of GoatTracker for UI and routines of the tracker and tildearrow of Furnace Tracker
  • Vitaly Novichkov (Wohlstand) for WOPN instrument format files
  • maak, SuperJet Spade, Dippy, RigidatoMS and ImATrackMan for sample modules
  • papiezak and Takeshi Abo for sample instruments
  • Yuzu4K for sample skin
  • Ru^3 for S98 file format documentation
  • がし3 (gasshi) for SCCI libraries
  • honet for C86CTL libraries
  • Gary P. Scavone and others for RtAudio and RtMidi libraries
  • Thanks Alexey Khokholov (Nuke.YKT) and Jean Pierre Cimalando for Nuked OPN-Mod emulation
  • Jean Pierre Cimalando and Olivier Humbert for French translation
  • freq-mod and Midori for Polish translation
  • binarycasper for Spanish translation
  • Ian Karlsson for ADPCM encoder/decoder
  • Aaron Giles for ymfm
  • Shay Green for resampling library
  • And everyone who helps this project!

bambootracker's People

Contributors

alexmyczko avatar ao2 avatar binarycasper avatar cxong avatar djtubig-malicex avatar ehaupt avatar enfaun avatar freq-mod avatar jpcima avatar nyanpasu64 avatar opna2608 avatar pigu-a avatar rerrahkr avatar trebmuh avatar wildmatsu avatar zeinok avatar

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bambootracker's Issues

Specific pitch sequence crashes the tracker when played

I was working on a module yesterday, and decided to book it and work on it later. When I loaded the module earlier today, it kept crashing after it got to a specific part in the song.

A friend and I have determined that it is the pitch sequence on instrument 03 (the snare drum) -- It would crash the tracker if played by itself only, and would not crash if the pitch sequence was changed.

Attached below is the module with the bug (in a .zip file, because Github doesn't accept .BTM files), I'm not sure if this is an adequate bug report or if this has been reported before - if it has, my apologies.

TEST.zip

Idea: Early Note effect, variable row density, and multiple rows at same time?

More unused j0CC ideas:

  • Early Note effect ^xx similar to 0Gxx but reversed
  • Define regions where row density is increased *= 2 (for 1/8 beat) or 3 (triplets) or 3/2 (triplets but possibly harder to implement and keep aligned when the region ends)
  • Multiple rows at the same time, but affected independently by 0Gxx or ^xx.
    • unsure if useful in bambootracker. definitely would be useful for manipulating nes dpcm delta-counter.

Problem when building 0.13 release under Linux

gui/mainwindow.cpp: In member function ‘void MainWindow::on_instrumentListWidget_customContextMenuRequested(const QPoint&)’: gui/mainwindow.cpp:944:8: error: ‘class QAction’ has no member named ‘setShortcutVisibleInContextMenu’; did you mean ‘setShortcutContext’? edit->setShortcutVisibleInContextMenu(true); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ setShortcutContext [...] Makefile:1639: recipe for target 'mainwindow.o' failed make: *** [mainwindow.o] Error 1

make produces lots of warnings related to mainwindow.cpp and one error above. OS is Ubuntu 18.04 LTS, all dependecies installed, I think.

[Idea] Automated CI build deployment

Looking at a discussion fa213ae there is a need for that.
Compiling from source on Windows is a chore, compared to Linux distros, since:
-there is no centralized package manager for distributing development libraries (Qt?)
-MinGW/MSYS can be a hassle

CI (continuous integration) services like AppVeyor can be used to test/build source code on Windows VM and then deploy the fresh devbuilds in binary form without a need to wait for a full release.
https://www.appveyor.com/docs/

Cannot open .BTM after reopening BambooTracker

Hi,

Was working on something for a couple hours. Not sure what happened but all of a sudden I am no longer able to reopen my .BTM file as it appears with an error:
image

I have attached the relevant .BTM file in the following zip.
djtBMX_BTM_bug.zip

Not sure what could suddenly cause this but I suspect it might have something to do with deleting and adding instruments?

Thanks,
-MaliceX

Crash when wrapping selection vertically, then cutting

Ubuntu 18.04 x64, master commit 1d5cf1b + 1 unrelated instrument editor change.

sd3winter-dev.btm.zip

  • Hold Shift+Up and allow the cursor to wrap to the bottom of the song. Selection does not appear.
  • Hold Shift+Right and selection appears.
  • Ctrl+X to initiate program crash.
  • Debugging in Qt Creator is impossible unless you remove try-catch from main().

int BambooTracker::getStepNoteNumber(int songNum, int trackNum, int orderNum, int stepNum) const, stepNum = 32 and my song has 32 rows/pattern.

Dependencies and Compile Instructions

I'd like to compile this on my own, to see how well compiling on Linux goes.

Could we possibly get a list of required libraries/programs and compile instructions?

Virtual Machine or WinXP - Make compatible with WinXP

I opened BambooTracker and still getting this message.
" The procedure entry point "CancelIoEx" could not located in the dynamic link library "Kernel32.dll" "

I should not work on Older machines. :(

Sorry for my old pcc And I didn't get new one

Ordinary module song ends up being unreadable

I don't know how it happened or is it a real bug.
I made a little test - just 2 patterns, one was empty, two instruments (one was FM, second was an unused SSG instrument),50 Hz tick freq, few notes there and there and I saved result. Now when I try to open it I only see this nonsense:
array::at:__n (which is 255) >= _Nm (which is 128)

If it's any help, there is a module in question - kona.btm.zip

ADPCM support

This tracker is surely promising, but i've noticed some issues:

1. After adding my first instrument and messing over with the parameters, i created a new one and somehow it overrides with the other instrument, it seems that the operators apply to every instrument you create at the moment.
2. The lack of the ADPCM channel, i'm sure this isn't really a problem but just letting myself know about that.
3. The volume column seems to scale volume in a reversed order. 00 being the loudest and 7F being the quietest.
4. Are you going to have support for loading Deflemask (.dmp) patch files?

Suggestion: default/selectable mixing presets

When exporting a file, Bamboo auto-fills the "System" box with PC-9801. This isn't necessary accurate.

When FM/SSG levels are matched, it's nearly exactly the same as an OPNA with no resistor on the SSG output and no amplification. On initial startup, Bamboo's 0/0 mixing is similar (if not the same as) a PC-88 with a Sound Board 2. With the SSG set to -3dB relative to FM, the output is again, very similar to (if not the same as) a PC-9801-86 board and one of my own Makoto boards for MSX. Makoto uses Yamaha's suggestion of a 470 ohm pulldown on the SSG output, and it's likely that the -86 does as well, making this the "proper" PC-98 mixing level.

Adding Mix Select boxes in the module properties menus for Sound Board 2 and 9801-86/Makoto guarantees proper sound when playing .vgm or .S98 on hardware with these platforms without a user having to enter the menu and reset it themselves.

This does not mean the options for arbitrary mixing should be removed, only to add selections for proper hardware levels.

FM envelopes not set properly when loading an .ins instrument file.

This is a bit hard to explain, but to put it shortly, some envelopes values are set in the wrong order when a new instrument is loaded as an .ins file, which often results on really bizarre sounds.

envelope
This screenshot shows the envelopes of a bass drum instrument. One window shows the incorrect settings, and the other showing how it should be. To "fix" this problem, I had to load the mentioned instrument through DefleMask, save it as a .dmp file, and then load said file to BambooTracker in order to get the correct settings.

I'm not sure if this problem is also present when other instrument file types are loaded, but yeah.

Here's another attachment, it has a .btm file to show the sound of both the incorrect and correct bass drums. It also has the bass drum instrument, as both .ins and .dmp files:
BambooTracker FMEnvelopeBug.zip

Improvements to cursor movement

  • Move cursor to right, not down, after entering effect type (possibly effect param as well)
  • Shortcut to "jump up/down to next highlighted beat"?
  • Editable step? 0 or greater.

Scrollbar directions reversed

When editing sequences in the instruments, dragging the scrollbar works properly, but the arrow buttons reverse up and down.

Applies to FM: TL, AR, DR, SR and applies to SSG: Tone/Noise, Envelope, Arpeggio, and Pitch.

YM2608 implementation in Bamboo is one octave too high in pitch

Let's compare Deflemask's YM2612 and Bamboo Tracker outputs:
Bamboo: https://instaud.io/359e (F#3, effect 02xx)
Deflemask: https://instaud.io/359f (the same)

As you can hear, OPN2 core in Deflemask goes much lower than Bamboo's OPNA, while they should sound pretty much the same. It seems that in Bamboo Ym2608 is one octave higher than it should be (C-0 is C-1, C-1 is C-2 and so on). Therefore there is no lowest octave. Some drums such as kicks or snares from PC-98 games are impossible to replicate here.

[bug] octave up/down keys don't work

I don't know if this is a bug or just things not being implemented yet, but

only main board / works. Number row * (Shift+8) does not, and neither does numpad / or numpad *.

Incorrect label when setting Buffer length to 1ms

Setting the Buffer length to 1ms followed by confirming and reopening the configuration dialogue will display TextLabel as the currently selected Buffer length. Doesn't seem to have any effect on playback though.

textlabel

SSG looping same pattern when exporting WAV or VGM

SSG 2 and 3 apparently end up looping the current pattern on editor when exporting to VGM and WAV
Not sure if this happens in all modules but it doesn't seem like there's anything I've done that caused it.

The track is supposed to sound like this (recorded through an external program)
https://dl.dropbox.com/s/qquzuh0ur9khfke/bamboo%20tracker%20recording.mp3
But when exporting to wave while the first pattern is selected, the WAV/VGM output sounds like this
https://dl.dropbox.com/s/zqao8zp1eatozrh/bamboo%20tracker%20wav%20export%201.mp3
When the second pattern is selected, it sounds like this
https://dl.dropbox.com/s/nx6jyoy7rivplw9/bamboo%20tracker%20wav%20export%202.mp3

Here's the module file
begin bossa.zip

Inheritance-based UI for instrument and pattern reuse?

Currently bambootracker, like ft, seems to use per-channel pattern indexing. If I use the same pattern in multiple order-rows, I frequently end up changing music I wrote previously (almost universally above my current position) and did not intend to change.

I also sometimes make the same mistake when reusing instrument sequences.

BambooTracker

  • Pressing Insert multiple times in order editor results in pattern numbers "0,6,5,4,3,2,1". Maybe Insert should move to next order-row.
  • All instruments default to sequence 0. (At least I appreciate the "Users: ..." field)
  • Pressing Esc doesn't close instrument editor (bug or intentional?)

Inheritance

(Basically these are ideas I wanted to implement into j0cc-ft, but never got around to doing the refactoring. Hopefully this codebase is newer and easier to work with. I can help write the code if you want.)

You can substitute order/instrument and pattern/sequence:

My ideas is that each order orders[i0] "owns" an array of patterns/sequences. To reuse one order's pattern, the other order orders[i1] "inherits" the pattern orders[i0][chan].

My concept for inheritance/references is that orders[i1][chan] is a Union[pattern, another order] (tagged union, sum type, std::variant, etc).

  • Simple approach: Set orders[i1][chan] = Ref(i0) for some optional Ref wrapper class.
  • To allow for reordering orders[], maybe orders[i0] == uuid0 and refers to patterns[uuid0][chan] for all chan.
    • patterns is a hashmap[uuid] -> hashmap/list[chan] -> pattern. IDK if you use enums or strings/etc. as channel numbers.
    • If (for specific chan) pattern [i1, chan] inherits from [i0, chan], orders[i1] == uuid1 and patterns[uuid1][chan] == uuid0 and points to orders[uuid0][chan]

My experiences with FT

This solves the issue where I create several instruments which all share sequence 0, then I enable/edit sequence 0 multiple instruments. (In 0CC, I can workaround by pressing "select next empty" whenever enabling a checkbox.)

This also solves the issue where adding an expansion chip defaults to all order[row][chan] = 0. (Which could be solved easily by setting order[row][chan] = row.)

0CC has "populate unique patterns" and "merge duplicate patterns". Often I reuse pattern 0 (with volume/effects) in multiple places, populate unique, then only change volume/effects in 1 place but not all copies. (I just did this a few days ago).

Avoid automatically modifying parent when editing child

When writing patterns, I often edit a lower pattern and accidentally mangle a higher one (earlier in time, composed earlier). (I don't know if I often edit an above pattern and accidentally mangle a lower one).

When copying instruments, I used to shallow-clone an instrument and edit the copy, mangling the parent. (Now I usually deep-clone, but sometimes I still make this mistake and open the file in another 0cc window to recover my unmodified instrument. I wish instrument undo existed.)

  • Solution: Clearly mark inherited patterns using a different background color (both in order table and pattern editor?).
    • Idea: Should parent patterns be marked as well? I don't know if accidentally editing the parent and mangling a child happens often, or if deliberately editing all similar tracks is more likely.

Editing children should not change the parent. Choices:

  • Copy on write? Any change to child pattern creates a distinct pattern.
  • Extensible children? (more applicable to patterns than instrument seqs)
    • Append extra effects into existing rows. Effects only exist in child, and add to (do not overwrite) existing effects.
    • Erase specific cells (effects).
    • Alter notes (I don't like this idea).

Mixer settings not saved properly.

When changing mixing settings, they're not saved properly. SSG always resets to 0dB when reopening the tracker. FM resets itself to +9 for values above +9, +6 for values between +3 and +6, and 0dB for values below +3dB.

Idea: Copying settings between FM ops?

I'm fairly new to FM, just tried using bambootracker, now I'm trying to switch algorithms. Currently alg4 has op2 as one output, but many other algorithms only support op4 as output. Is it useful for people other than me to be able to switch operator settings around?

Solutions:

  • Ability to copy all FM envelopes as text: global settings on first line, 4 ops on subsequent lines
    • open text editor and move lines to move operators around
  • copy/paste buttons for individual ops?

Option "Show row numbers in hex" broken

Display order numbers and the order count on the status bar in hexadecimal.

Unsetting the "Show row number in hex" option only affects the currently selected order in the order list.

It doesn't affect

  • the status bar display
  • the numbering of all orders in the order list that aren't the currently selected order

A screenshot (working on German i18n, but the bug's replicable without it)
grafik

System:

  • Ubuntu 18.04.2 LTS x86_64
  • Commit 4be0b10 (behind the Appveyor commit, but I doubt it had any effect either)

Permit piano keyboard keys to be rebindable

The keybinds for adding notes, as the README mentions, are:

There are two rows of a piano keyboard:

Current octave+1
 2 3  5 6 7  9
Q W ER T Y UI O

Current octave
 S D  G H J  L
Z X CV B N M, .

This works fine on a QWERTY keyboard.

Using a non-QWERTY however, like the German QWERTZ, French AZERTY or, well, the Russian JCUKEN using Cyrillic script can either take some getting used to or might just not work at all. (I can only speak for myself, using a QWERTZ keyboard.)

I propose that, at least, these keys should be rebindable. They can stay the default, I highly doubt that the majority of users will be using a non-QWERTY layout, but the user should be able to change the mapping and save it how they see fit. The groupbox for changing the keys to change the current octave etc. could be moved into the same settings window tab as well.

Perhaps offering some presets for different layouts as well would be the icing on the cake.

Crash when opening file with LFO/Op. sequence

Regarding the following file: https://ocv.me/tmp/1.btm

When opening this file, BambooTracker crashes. Here is the output:

Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt.
You must not let any exception whatsoever propagate through Qt code.
If that is not possible, in Qt 5 you must at least reimplement
QCoreApplication::notify() and catch all exceptions there.

Segmentation fault

The error is somewhere in FileIO::loadInstrumentPropertySectionInModule, inside case 0x00: // FM envelope when i == 4.

Please do not try to rescue data from this file. I am only uploading this file in case you need sample data to help reproduce this crash :-)

I was playing around with all of the operator parameters, and may have created an instrument which is nonsensical/illegal. One of the things I recall doing was to create an LFO/Operator sequence for instrument 00. Parameters: ☐ LFO, Operator: AL, ☑ Sequence, and the sequence itself was [2 4 6] (Loop). When creating a blank song with this configuration, a similar crash is reproduced.

A few things regarding SSG

Hey, good job on the first release! I'm surprised by how much work did you put into the SSG portion, but in my opinion you missed (or maybe didn't implement yet, who am I to know) two thhings that would make using the SSG that much easier:

  • Envelope autotuning (AutoEnv)
    If you set the SSG instrument to use an envelope (saw/triangle), you can control its pitch in the pattern window. However, if you choose a tone+envelope instrument (Tri w/Saw w), only the tone pitch gets modified while the envelope pitch stays static. It would make things easier if you could add a flag that sets the envelope pitch along with the tone pitch (so when you play F-2, both envelope and tone pitches are F-2). Moreover, if that gets implemented, an ability to change the pitch ratios (for example ratio 1:2 would play the tone at F-1 while the envelope is played at F-2,like in Vortex Tracker 2) would be highly appreciated.
  • Noise+tone/envelope combos
    One thing that has been omitted was the combination of Noise with Tone or Envelope (or both). It makes for really interesting sounds. It actually is there, I just couldn't manage to find it. (If anyone is still interested, set the Waveform to Tri or Saw, and set the Tone/Noise to T+N)

I haven't digged into the FM portion quite yet (because i'm a total n00b when it comes to FM), but so far i like where it's going!

Output to MML

Is it possible to output/export to MML? It would make it a lot easier to play on a real OPNA

Enhancement: icon for BambooTracker

I have created an icon for BambooTracker that I would like to propose.
It's drawn in a pixel-art style, using only colours from the 12-bit master palette of the PC-98.
The 16x16 version is unique, while all other sizes are integer upscales of the 32x32 version.

I have attached a preview image and the .ico file in a ZIP archive.
bambootracker ico-preview
BambooTracker icon.zip

Valgrind: opna_controller.cpp:1338 - conditional jump with uninitialized value

This segment of code:

https://github.com/rerrahkr/BambooTracker/blob/b315fb027f3c8c3fb5f3c609f8f35c070b70858a/BambooTracker/opna_controller.cpp#L1338-L1340

contains a logical error according to Valgrind, which it found when playing a module:

==29767== Conditional jump or move depends on uninitialised value(s)
==29767==    at 0x1FF633: OPNAController::keyOnSSG(int, Note, int, int, bool) (opna_controller.cpp:1338)
==29767==    by 0x1807E5: BambooTracker::readSSGStep(Step&, int, bool) (bamboo_tracker.cpp:1780)
==29767==    by 0x17FC99: BambooTracker::readStep() (bamboo_tracker.cpp:1656)
==29767==    by 0x17B49D: BambooTracker::streamCountUp() (bamboo_tracker.cpp:1132)
==29767==    by 0x1427D1: MainWindow::onNewTickSignaled() (mainwindow.cpp:2088)
==29767==    by 0x162068: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (MainWindow::*)()>::call(void (MainWindow::*)(), MainWindow*, void**) (qobjectdefs_impl.h:136)
==29767==    by 0x1609F4: void QtPrivate::FunctionPointer<void (MainWindow::*)()>::call<QtPrivate::List<>, void>(void (MainWindow::*)(), MainWindow*, void**) (qobjectdefs_impl.h:169)
==29767==    by 0x15EA97: QtPrivate::QSlotObject<void (MainWindow::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (qobject_impl.h:120)
==29767==    by 0x63BC6CE: QMetaObject::activate(QObject*, int, int, void**) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.9.5)
==29767==    by 0x312984: AudioStream::streamInterrupted() (moc_audio_stream.cpp:142)
==29767==    by 0x1A365C: AudioStream::AudioStream(unsigned int, unsigned int, unsigned int, QString)::{lambda()#1}::operator()() const (audio_stream.cpp:19)
==29767==    by 0x1A4407: QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, AudioStream::AudioStream(unsigned int, unsigned int, unsigned int, QString)::{lambda()#1}>::call({lambda()#1}&, void**) (qobjectdefs_impl.h:130)
==29767==  Uninitialised value was created by a heap allocation
==29767==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29767==    by 0x186BEA: std::_MakeUniq<OPNAController>::__single_object std::make_unique<OPNAController, unsigned int const&, unsigned int, unsigned long>(unsigned int const&, unsigned int&&, unsigned long&&) (unique_ptr.h:825)
==29767==    by 0x174B85: BambooTracker::BambooTracker(std::weak_ptr<Configuration>) (bamboo_tracker.cpp:27)
==29767==    by 0x165041: void __gnu_cxx::new_allocator<BambooTracker>::construct<BambooTracker, std::shared_ptr<Configuration>&>(BambooTracker*, std::shared_ptr<Configuration>&) (new_allocator.h:136)
==29767==    by 0x164597: void std::allocator_traits<std::allocator<BambooTracker> >::construct<BambooTracker, std::shared_ptr<Configuration>&>(std::allocator<BambooTracker>&, BambooTracker*, std::shared_ptr<Configuration>&) (alloc_traits.h:475)
==29767==    by 0x163833: std::_Sp_counted_ptr_inplace<BambooTracker, std::allocator<BambooTracker>, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::shared_ptr<Configuration>&>(std::allocator<BambooTracker>, std::shared_ptr<Configuration>&) (shared_ptr_base.h:526)
==29767==    by 0x161C4E: std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<BambooTracker, std::allocator<BambooTracker>, std::shared_ptr<Configuration>&>(std::_Sp_make_shared_tag, BambooTracker*, std::allocator<BambooTracker> const&, std::shared_ptr<Configuration>&) (shared_ptr_base.h:637)
==29767==    by 0x1606A3: std::__shared_ptr<BambooTracker, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<BambooTracker>, std::shared_ptr<Configuration>&>(std::_Sp_make_shared_tag, std::allocator<BambooTracker> const&, std::shared_ptr<Configuration>&) (shared_ptr_base.h:1295)
==29767==    by 0x15E774: std::shared_ptr<BambooTracker>::shared_ptr<std::allocator<BambooTracker>, std::shared_ptr<Configuration>&>(std::_Sp_make_shared_tag, std::allocator<BambooTracker> const&, std::shared_ptr<Configuration>&) (shared_ptr.h:344)
==29767==    by 0x15D135: std::shared_ptr<BambooTracker> std::allocate_shared<BambooTracker, std::allocator<BambooTracker>, std::shared_ptr<Configuration>&>(std::allocator<BambooTracker> const&, std::shared_ptr<Configuration>&) (shared_ptr.h:691)
==29767==    by 0x15A954: std::shared_ptr<BambooTracker> std::make_shared<BambooTracker, std::shared_ptr<Configuration>&>(std::shared_ptr<Configuration>&) (shared_ptr.h:707)
==29767==    by 0x12FCD3: MainWindow::MainWindow(QString, QWidget*) (mainwindow.cpp:55)

It doesn't appear to cause any harm, but it should be investigated nonetheless. If this error is irreplicable on your end, I can attach 2 modules that successfully triggered this error for me.

(OS: Ubuntu 18.04.2 LTS x86_64)

A few requests to make the usability better

You've probably thought about some of them but just to reinforce

1 - A way to remap key commands
I use a laptop without a numeric pad, so I don't have access to the default keys to change octaves, also for me it's not intuitive to have - as a key-off

2 - Volume commands
While I know that the TL values on FM makes lower numbers louder, most FM editors I know account for that and make reverse this order. I think your tracker would really benefit from it, mainly considering the SSG and RHY have louder values on higher numbers as well.

3 - Change the order of input for columns that require 2 digits
Considering the SSG and most effect commands use just "00-0F", I think altering the last digit with the first input would make it faster to use, so one just needs to input 1 digit to achieve the effect. Deflemask handles this well.

4 - Instrument editor
I really like how it looks and how it works, but it's hard to input precise numbers on the values that have more of them, like DR/SR and TL. A way to either slow down the cursor (like pressing CTRL on VOPM) or just letting me input directly the numbers would fix it.

As a side note: please make the tracker able to load .OPM and .TFI files, those are the most common FM sound formats, OPM is text-based so it should be the easiest to inplement.

5 - Envelope Reset
The OPNA doesn't reset the envelopes by default before key-off so I think this is a nice feature, but turning the option off will just make every note legato, rather than not resetting the envelope. I think legato should be a different option from envelope reset.


I really liked your tracker and I'm surprised on how much it has for a first release, I hope you'll continue to improve even further! (I also hope you plan on making it output a playable format for the PC98, since there's no VGM players for it yet....)

[Request] Instrument Editor - Paste from plain text instrument format

Considering there's a lot of plain text instrument formats, like OPM, FMDrive and MML formats, I think it would be nice to have a way to support them and I think pasting from clipboard would be the easiest one. So I was thinking of a thing like Right Click -> Paste From... -> (List of formats)

OPM and MML formats such as PMD, FMP and MUCOM88 would probably be the easiest to implement since the FM instrument settings are in a similar order despite there being differences between them.

So here are some examples of the same instrument in different formats:

BambooTracker clipboard instrument definition (spacing added for definition):

            FB ALG
FM_ENVELOPE: 0,  5,
AR DR SR RR SL TL KS ML DT SSGEG
31,22,12, 6, 6, 0, 1, 0, 1,-1,
31,17,12, 9, 6, 4, 1, 6, 5,-1,
31, 8, 2, 9, 5, 4, 1, 0, 7,-1,
31,31, 5,12, 0, 0, 1, 0, 3,-1,

VOPM

@:0 CH1
//  LFRQ AMD PMD WF NFRQ
LFO: 199  64  64  2    0
// PAN FL CON AMS PMS SLOT NE
CH: 64  0   5   0   0  127  0
//  AR D1R D2R RR D1L  TL KS MUL DT1 DT2 AMS-EN
M1: 31  22  12  6   6   0  1   0   1   0      1
C1: 31  17  12  9   6   4  1   6   5   0      1
M2: 31   8   2  9   5   4  1   0   7   0      1
C2: 31  31   5 12   0   0  1   0   3   0      1

PMD

;   ALG FB
@ 0   5  0
; AR DR SR RR SL  TL KS ML DT AMON
  31 22 12  6  6   0  1  0  1    1
  31 17 12  9  6   4  1  6  5    1
  31  8  2  9  5   4  1  0  7    1
  31 31  5 12  0   0  1  0  3    1

FMP

'@ 0 A
   AR DR SR RR SL  TL KS ML DT AMON
'@ 31,22,12, 6, 6,  0, 1, 0, 1, 1
'@ 31,17,12, 9, 6,  4, 1, 6, 5, 1
'@ 31, 8, 2, 9, 5,  4, 1, 0, 7, 1
'@ 31,31, 5,12, 0,  0, 1, 0, 3, 1
  AL FB
'@ 5, 0

MUCOM88

  @ 0:{
; FB  AL
   0,  5
;  AR  DR  SR  RR SL TL KS ML DT
  31, 22, 12,  6, 6, 0, 1, 0, 1
  31, 17, 12,  9, 6, 4, 1, 6, 5
  31,  8,  2,  9, 5, 4, 1, 0, 7
  31, 31,  5, 12, 0, 0, 1, 0, 3,"??????"}

The common thing is that only BambooTracker supports SSGEG on the instrument definition, but it doesn't support AMON/AMS-EN, in OPM/PMD/FMP it should put a "-1" instead of the AMON definition. Since MUCOM88 doesn't use this as well, it should just add a -1 after the end of each line.

Text-based module format, compatible with git diff?

Are you interested in adding a text-based export format like FT? Possibly as a native open/save file format (not just import/export) so opening a text and pressing Ctrl+S produces a text file instead of .btm?

Things I would improve from FT text export:

  • 1:1 mapping between orders and visible text (achievable through #14 )
  • Removing pattern numbers? Maybe makes diff/merge easier, maybe makes parsing complicated and error-prone.

Right-clicking order editor leads to disabled menu

Kubuntu 18.04 x64, Qt 5.9.5.

I cannot add new orders by right-clicking the black space around the orders. Instead the menu is grayed out without an indication as to what's wrong.

Instead, I have to click the actual numbers. I find this unintuitive.


Is there a keyboard shortcut to switch between order and pattern editor?

"Mute/Solo Track" uses keyboard caret location, not mouse click location

In 0CC/FT, right-clicking channel headers gives options to toggle/solo channel. (So does right-clicking the pattern itself, though the menu is different.)

In Bamboo:

  • Right-clicking the pattern has the same menu as the header.
  • "Mute/Solo Track" affects the channel under keyboard caret, which (unlike text editors) does not move to the mouse location. It should affect the channel under mouse cursor.
  • When I "Solo Track" twice on different tracks (keyboard caret), the second time it unmutes all instead of soloing my new track.
  • (bug or not?) 0CC "toggles solo" when double-clicking a channel header quite quickly (not slowly). Bamboo doesn't handle that case.

Bamboo has "mute track" (less useful than left-clicking) while 0CC has "toggle track" (identical to left-clicking). Neither tracker opens right-click menu when I press the keyboard Menu key, making the menu item useless (except 0CC but not Bamboo tells you the corresponding keyboard shortcut).

  • I think Bamboo should display shortcut text for each menu action. it aids discoverability (https://news.ycombinator.com/item?id=18584381)
  • Also, Bamboo should underline menu items by prepending & to letters. &Action becomes _A_ction and I can open the menu, then press A to activate that quickly from the keyboard. I feel it's faster than using a mouse. (I noticed the main menu already has underlines.)

Some Crash

Hey. Thanks for trying out. So first to all I found the issue

  1. Open Bamboo, go instruments, right click to add or loading 2 instruments, Right click at the first instrument, edit name, when renaming instrument, go to cursor instrument 2, right click on the instrument 2, Select any options and it crash. :(

  2. Click ... Or module properties, at the insert song on title write something, and press enter. And it terminated with error code.

English broken. Sorry

Enhancement: use system's config directory

While the current system of storing the configuration config.json in the current directory works well enough, it would be desirable to save it to and load it from a fixed directory in a cross-platform way (meaning no hardcoded Windows path or otherwise Windows-only solution).

Using QSettings in IniFormat (or NativeFormat, which uses the Registry on Windows) seems convenient for this purpose:
http://doc.qt.io/qt-5/qsettings.html

This isn't anything super urgent, so it doesn't require to be implemented immediately, but it'd be nice to see in the future :)

No sound after changing output device in Windows

I am using two separate audio outputs in Windows: one for headphones, and another for speakers. I never have both enabled at the same time, but I switch between them a lot.
BambooTracker fails to switch devices correctly.

Steps to reproduce:

  • Have only one sound device enabled. Bamboo will produce sound.
  • Close Bamboo
  • Enable another sound output device and disable the one that was previously used.
  • Open Bamboo. Now it will not produce sounds.
  • To bring back the sound, open the Configuration window, go to the Sound tab and press OK.

I'm no coder, but I think this could be fixed by making Bamboo default to the, well, "default" (for Windows) sound output.

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.