From a3ec0caa15f6e9b4ce65f5f3dfdbe6b1dba357f6 Mon Sep 17 00:00:00 2001 From: djdiskmachine <110535302+djdiskmachine@users.noreply.github.com> Date: Sat, 3 Feb 2024 01:02:03 +0100 Subject: [PATCH] 1.3o_2 (#73) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds: Alt row count colors, shoutout to https://github.com/edne ! 00 and FE song screen colors, shoutout to https://github.com/koi-ikeno ! RG35XX build, thanks to https://github.com/jpma29 for help with testing! Fixes: Root folder detection causing issues with importing samples on some systems (thank you jpma29) Name generator causing issues with importing samples on some systems (thanks Dosly) Actually random names (fixed random seed, thx Eldsvåda:) Save as fixed on MIYOO systems (thx Pret4t) Other: Refactor help legend * Restore legacy samplelib root The new way of identifying the sample lib root caused issues in W32, Miyoo Restored legacy method for now * Fix for name generator Adresses issue with not being able to import samples for some systems Fill differance of old name and new name with spaces Overwrite with new name after, preserving string terminator Bump build number * Config options to change SongView FE/00 colors (#72) * Config options to change songview FE/00 colors * Description to documentation and xml files * Seed name correctly * Fix for save as Don't use relative paths, always use root reference. Small refactor * Alternate between two colors in row count Refactor and change default colors Update documentation and include in packaging Squashed commit of the following: commit 84fdbf783c7db6f7c302bac586dd937e1ce2a412 commit b1726feada063669d4d98bc3359330009163be55 commit 9eb99c8b6fb2a0b632976e2f272598f5dd445d1e * Refactor help legend Use switch instead of string compare * Documentation and colors Update config_xml.md with entry on new colors Clarify how to use slice mode Unify example config.xml Change default colors --------- Co-authored-by: Edoardo N Co-authored-by: koisignal Co-authored-by: djdiskmachine --- docs/LGPTConfiguration.md | 11 +- docs/What-is-LittleGPTracker.md | 565 ------------------ docs/wiki/What-is-LittleGPTracker.md | 28 +- docs/wiki/config_xml.md | 21 +- projects/resources/CHIP/config.xml | 9 + projects/resources/DEB/config.xml | 19 +- projects/resources/MIYOO/config.xml | 12 + projects/resources/config.xml | 12 + projects/resources/packaging/config.xml | 30 + projects/resources/packaging/lgpt_package.sh | 3 +- sources/Application/AppWindow.cpp | 22 +- sources/Application/AppWindow.h | 4 + sources/Application/Model/Project.h | 2 +- sources/Application/Utils/HelpLegend.h | 219 ++++--- sources/Application/Utils/RandomNames.h | 15 +- .../Application/Views/BaseClasses/View.cpp | 7 + sources/Application/Views/BaseClasses/View.h | 7 +- sources/Application/Views/ChainView.cpp | 2 +- sources/Application/Views/GrooveView.cpp | 2 +- .../Views/ModalDialogs/ImportSampleDialog.cpp | 3 +- .../Views/ModalDialogs/NewProjectDialog.cpp | 2 +- sources/Application/Views/PhraseView.cpp | 16 +- sources/Application/Views/PhraseView.h | 2 +- sources/Application/Views/ProjectView.cpp | 35 +- sources/Application/Views/SongView.cpp | 26 +- sources/Application/Views/TableView.cpp | 18 +- sources/Application/Views/TableView.h | 2 +- 27 files changed, 343 insertions(+), 751 deletions(-) delete mode 100644 docs/What-is-LittleGPTracker.md create mode 100644 projects/resources/packaging/config.xml diff --git a/docs/LGPTConfiguration.md b/docs/LGPTConfiguration.md index 6d352ba2..ff049dd4 100644 --- a/docs/LGPTConfiguration.md +++ b/docs/LGPTConfiguration.md @@ -106,7 +106,16 @@ LittleGPTracker uses 4 colours to do all the drawing. If you want, you can redef - `HICOLOR1`: row count in song screen -- `HICOLOR2`: cursor color +- `HICOLOR2`: inverted color + +- `CURSORCOLOR` : Cursor color + +- `ROWCOLOR1` : Row count color 1 + +- `ROWCOLOR2` : Row count color 2 + +- `ALTROWNUMBER` : How many rows before alternating between ROWCOLOR1/2 + All colors are defined by a set of hexadecimal triplet for RGB. Here's an example: diff --git a/docs/What-is-LittleGPTracker.md b/docs/What-is-LittleGPTracker.md deleted file mode 100644 index d01f5fc0..00000000 --- a/docs/What-is-LittleGPTracker.md +++ /dev/null @@ -1,565 +0,0 @@ -# What is LittleGPTracker? -[*LittleGPTracker*](http://www.10pm.org/nostromo/lgpt/) *(a.k.a piggy tracker) is a sample based tracker originally programed for the gamepark handhelds, but now also available for Microsoft Windows and Mac OSX. It implements a user interface similar to the refined track-by-joypad software* [*littlesounddj*](http://www.littlesounddj.com/)*. Piggy currently supports 8 monophonic 8Bit/16Bit/44.1Khz stereo channels as well as 16 channel midi output. Piggy is currently under development and the latest versions of the program (along with unstable ghetto builds) can be found at* [*http://gorehole.org/lgptWiki/*](http://gorehole.org/lgptWiki/)*.* -You are reading a reference manual for those who are comfortable with LSDj or trackers in general. An alternative introduction to LittleGPTracker is our very own [quick_start_guide](http://wiki.littlegptracker.com/doku.php?id=lgpt:quick_start_guide). If you have a question this manual does not answer, please ask on the [lgpt mailing list](http://groups.yahoo.com/groups/littlegptracker/) or in #hexawe on efnet. Don't forget to check out the advanced [tips_tricks](http://wiki.littlegptracker.com/doku.php?id=lgpt:tips_tricks) -If you want to grab some sounds to get off the ground quickly, or want to hear and see what other people have been doing with piggy tracker, download some of the .zip archives from [http://hexawe.net](http://hexawe.net/)! - -# Files -## Installation - -Grab the installation package for your platform from the [download page](http://www.10pm.org/nostromo/lgpt/download.php). Extract the files from the archive & copy it where you like. after that you can run the executable type for your system, located in the lgpt root or in the /bin folder. linux users may need to set the binary as executable (chmod a+x lgpt.deb-exe). - -## Directory Structure -- **bin** - - **lgpt.exe / lgpt.deb-exe / lgpt.app** … desktop executable file - - **SDL.dll** … dependency - - **stderr.txt** … debugging output file (created at startup and removed upon exit) - - **stdout.txt** … debugging output file (created at startup and removed upon exit) -- **docs** - - **readme.txt** … credits and links to piggy resources - - **revision.txt** … version history, describes how new features work if they're not included in the manual yet -- **lgpt10k** … Project folder to the author's entry for the [10k compo](http://www.10pm.org/nostromo/lgpt/10k.php) (M-.-n : Tardline) Note: all projects start with lgpt* - - **Samples** … each project loads wav files from it's own Samples directory - - **lgptsav.dat** … all projects store their data in xml files called lgptsav.dat -- **lgptNew** … another piggy project, following the lgpt* naming convention for projects - - **Samples** … when you start a new project you have to make a Samples directory and load it up (NOTE: Since version X.XX??? this is unnecessary as LGPT creates this folder when a new project is created in the opening selector screen) - - **lgptsav.dat** … this file doesn't exist for new projects but will be created by lgpt when you first save -- **lgpt.fxe** … gp32 executable -- **lgpt.gpe** … gp2x executable -- **SampleLib** … Place your samples here - -Getting lgpt to run depends on your platform: - -- **gp32:** place LGPT.fxe, lgptNew, and lgpt10k in \GPMM -- **gp2x/caanoo:** place LGPT.gpe, lgptNew, and lgpt10k in the same folder (anywhere on your SD card) -- **win/mac/*nix :** everything should be in the right spot, just run the executable in \install\bin\ (for fullscreen run “lgpt.exe -fullscreen”) -## Importing Samples - -Piggy doesn't save samples inside a project file like traditional trackers. Instead, when you save, piggy will create project data as /lgptRoot/lgptProject/lgptsav.dat and store the samples you are using in /lgptRoot/lgptProject/samples. This means that instead of copying/sharing a single module file, you need to distribute the whole lgptProject directory. - -Samples can get inside that /lgptRoot/lgptProject/samples folder two ways: using the sample import dialog inside of piggy, or copying the wav files in by hand (via whatever os you are running). - -The sample import dialog is the easiest way to preview and add files to your lgptProject. Any samples which you import from that screen will be copied from the samplelib to /lgptRoot/lgptProject/samples when you save the project. -If you like to do things by hand you can make a new lgptProject folder and a samples folder in there. Prior to loading a project for the first time you can copy some wav files into /lgptRoot/lgptProject/samples and piggy will automatically assign each wav to a new instrument. -After that you can copy additional wavs to the lgptRoot/lgptProject/samples directory. The next time you load the project piggy will have them in it's sample list but the wavs will not yet be associated with any instruments. - -**Use 8 or 16 Bit wav files, any sampling frequency, mono or stereo**. 8bit samples are converted to 16bit at load time for compatibility with the engine (you can save space in storage but not in RAM). - -**Piggy now supports .sf2 Soundfonts. You must add these by hand to your SAMPLES directory, use PROGRAM CHANGE commands to load different patches. Loop points are automatically loaded, but you'll need to make VOLM setting to adjust decay.** - -## Multiple Projects - -The Piggy supports multiple projects! Just create multiple directories in the root folder (where lgptNew and lgpt10k were found). Examples: “lgptProject1”, “lgpt*Author*Name”, “lgptSomethingElse”, “lgptWhatever”, etc. Each project directory must contain its own samples which must be stored in a sub-directory called “samples”. Lgpt will prompt you to choose one of the projects found in the root (lgpt- directories) when starting up. -Important Points to Remember: - -- Project directories **must** start with “lgpt”. -- Project directories **must** go in the root folder. -- You can reuse a previously made lgptsav.dat file. -- Lgpt will list all the projects available on startup. -- The lgptsav.dat file is created automatically the project's folder using the piggy's save function (see Controls & Moves). You should not create tah file manually. -- Save often :) -## config.xml - -The config file is used to tweak certain global parameters of the application. It is not mandatory to have one but it will allow you to change key mapping, color scheme, key repeat setting and other. -For more details check out the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config) page - -# Controls & Moves - -If you want to change the default mapping in LGPT, you will want to edit the confiq.xml. More information can be found on this on the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config) -If you want to augment the mapping controls to add a usb footpedal, another joystick, macros using additional buttons on your device, or even control of piggy via midi commands, check out [mapping](http://wiki.littlegptracker.com/doku.php?id=lgpt:mapping) - -## Key Mapping - -**Gamepark keys** - -- DPAD (or references to LEFT, RIGHT, UP, DOWN): Common Joystick directions. -- A, B: As themselves. -- SELECT, & START: Starring as themselves. -- RT: Right trigger (shoulder button). -- LT: Left trigger (shoulder button). - -*GP2X Specific notice*: The A & B buttons are “inverted” (when compared to GP32 and LSDJ on Gameboy). This can be modified in the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config). - -The moves are close to what you would pull in lsdj, but shoulder buttons replace the lsdj SELECT key. Most of the time, the equivalent of SELECT is the shoulder button opposite the other buttons you're pushing. For example SELECT+B is LT+B, SELECT+RIGHT is RT+RIGHT. - -**Windows key mapping** - -These are the defaults, which can be over-ridden in the config.xml file: - -- A: A on US keyboard. -- B: S on US keyboard. -- START: Space. -- LT: Right Ctrl Key. -- RT: Left Ctrl Key. -- LT+RT+SELECT Combo: Esc Key (Go to Project Selection Screen/Quit LGPT). - -Note: CTRL Key mappings of RT and LT are inverted. Since the keyboard's Arrow Keys are on the opposite side compared to the GamePark layout, so are LT and RT. - -## Basic Editing & Navigation -- ARROWs: In screen navigation. -- A: Insert Chain/Phrase/Note. -- A,A: Insert next unused Chain/Phrase/Instrument. -- LT+(B,A): Clone. This will overwrite the current Highlighted Item with a copy of itself using the next unused Item available. -- B+A: Cuts the current Highlighted Item . -- A+ARROWS: Updates Highlighted Item value. - - A+UP/DOWN: +/- 0x10. - - A+RIGHT/LEFT: +/- 1. -- B+ARROWS: Rapid Navigation. - - B+UP/DOWN: Page up/down in Song Screen, Next/Previous Phrase in Current Chain in Phrase Screen. Navigation +/- 0x10 in Instrument/Table Screen. - - B+LEFT/RIGHT: Next/Previous Channel in Chain/Phrase Screen. Navigation +/- 1 in Instrument/Table Screen. Switch between Song and Live Modes in Song Screen. -- RT+ARROWS: Navigate between the Screens. -- LT+UP/DOWN: Jump up/down to next populated row after a blank row (great for live mode entire row queuing!) - -## Selections - -a few ways to make a selection: - -- LT+B: Starts selection mode with only the data at the cursor selected -- LT+B+B: Starts selection mode with the cursor's row selected -- LT+B+B+B: Starts selection mode with the entire screen selected - -once a selection is started you can do a few more things: - -- ARROWS: will make an existing selection bigger or smaller -- B: copy selection to buffer, or -- LT+A: cut current selection - -And then: - -- LT+A: paste the clipboard content at current location - -## Playback Modes and Controls - -There are two modes for playback, Song and Live. The controls in each mode differ slightly. -You can switch between the modes by hitting B+LEFT/RIGHT in the Song screen. - -**Song Mode** - - START: - -In the Song Screen: Starts/Stops song playback from the Highlighted Row. If one of the Row's Channel is marked `--`, LGPT will ignore that Channel entirely for the rest of the playback. -In the Chain Screen: Starts/Stops playback from the Highlighted Step, soloing the Edited Chain. -In the Phrase Screen: Starts/Stops playback from Step `00`, soloing the Edited Phrase. - - RT+START: - -Starts song playback from the Edited Row in all screens. - -**Live Mode** - - START: - -In the Song Screen: Queues from the Highlighted Channel Step. -In the Chain Screen: Queues the Highlighted Phrase Step. -In the Phrase Screen: Queues the Edited Chain Step from `00`. - -- The Queued Item will be played as soon as the playing Chain on the Edited Channel reaches its last Step. -- If there is no playing Chain Step on the Edited Channel, the next Song Chain that reaches its last Step will trigger playback. -- Queued Items are shown with a blinking `>`. - - START[again]: - -Pressing `START` a second time will queue the Item using Immediate Mode. - -- The Queued Item will be played as soon as the playing Phrase on its Channel reaches the last Step. -- Immediate Mode Queued Items are shown with a fast blinking `>`. - - LT+START: - -In the Song Screen: Queues all Channel Steps on the current Row. - -- The Queued Items will be played as soon as the playing Chain on their Channel reaches its last Step. -- Queued Items are shown with a blinking `>`. - - LT+START[again]: - -Pressing `START` a second time will queue the Items using Immediate Mode. - -- The Queued Items will be played as soon as the playing Phrase on the their Channel reaches its last Step. -- Immediate Mode Queued Items are shown with a fast blinking `>`. - - RT+START: - -In all Screens: Queues the Edited Channel Step to be stopped. - -- The Queued Channel will be stopped as soon as its playing Chain reaches the last Step. -- Queued Items are shown with a blinking `_`. - - RT+START[again]: - -Pressing `START` a second time will queue the Items using Immediate Mode. - -- The Queued Channel will be stopped as soon as its playing Phrase reaches the last Step. -- Immediate Mode Queued Items are shown with a fast blinking `_`. - -## Muting - -- RT+B: Toggles mute/unmute of cursor channel - - if RT is released before B, channel stays mutes - - if B is released before RT, channel goes back to original state -- RT+A: Solo cursor channel - - if RT is released before A, channel stays solo'ed - - if A is released before RT, all channel go back to original state -- LT+RT: restore full playback on all channels -- RT+A,RT+B can be used in conjunction with selections. If a selection is present the toggle mute/solo action is done on all channels present in the selection - -## System Operations -- (DEFUNCT →)Return to the song selection screen by pressing L_SHOULDER+R_SHOULDER+SELECT (Esc on windows). Only works when piggy is not playing. WARNING: all data is currently forgotten when resetting to the song selection screen. - -# Screens - -## Screen Map - -``` -o888 o8 - 888 oooooooo8 ooooooooo o888oo - 888 888 88o 888 888 888 - 888 888oo888o 888 888 888 -o888o 888 888 888ooo88 888o - 888ooo888 o888 *screenmap by Sm0hm* - - _-------_ _-------_ - | | | | - | P | | G | - | | | | - project-- groove--- - ^ ^ - v v - _-------_ _-------_ _-------_ _-------_ - | | | | | | | | - | S | <-> | C | <-> | P | <-> | I | - | | | | | | | | - song----- chain---- phrase--- instrument - ^ ^ - v v - _-------_ _-------_ - | | | | - | T | <-> | T | - | | | | - table---- table---- -``` - -To move from one screen to the other, press the RTrigger combined with the direction. To get to the chain screen, you need to have your cursor on a chain in the song. To get to the phrase screen, you need to have your cursor on a pattern in the chain screen. - -## Selector Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140398472_selector_1.1f.png) - -- All the folders you have named as lgptWhatever will show up here. -- Up and Down to select a project, hit A to load the project. -- B+Up/Down will go Up/Down a whole page. - -## Project Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140419022_project_1.1f.png) - -- **Tempo:**: Can be set between 60bpm [0x3c] and 400bpm [0x190]. Resolution aligned to LSDJ. -- **Master:** Main volume goes from 10% to 200%. Piggy is loud now! -- **Transpose:** Live transposition of every triggered instruments. -- **Compact Sequencer:** Free all unused chain/phrases. -- **Compact Instruments:** All unused instruments get their sample set to (null), old parameter settings stick. A dialog offers to remove unused samples. -- **Load Song:** Brings you back to the Selector Screen. -- **Save Song:** Save the work you do, and save frequently! The cursor will disappear while the data is being written. -- **midi:** Lets you chose external MIDI device. - -## Song Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140431434_song_1.1fb.png) - -- Songs are made up of chains. Each hex number on the song screen grid is a chain. You can navigate to any of those chains by putting your cursor on one and hitting RT+R. -- The top of the song screen displays if you are in SONG or LIVE mode (toggle with B+L or B+R) and the name of the project you are editing (choose a new one with LT+RT+SELECT, but save before you go there because there is no turning back). -- On the bottom of the screen is the play-time visualizer. Each box correlates with the above columns in the song grid. When a sample is triggered in one of the columns, the note value of that trigger is displayed in the play-time visualizer. -- On the right of the song screen we have some more play-time statistics. First there is the clip indicator which displays “—-” when your volume levels are ok and “clip” when you've cleared the headroom and are chopping off the top of your samples. Next is the CPU load indicator as a percentage value. After that is the number “100” that will flash when your battery is getting low (gp2x firmware 2.X and lower only!). The bottom row of the play-time statistics is the amount of time which has passed since you pressed start. -- You can make a new chain by hitting A,A on a blank space in the song screen grid. -- You can clone a chain by highlighting it with the cursor and pressing LT+(B,A). -- You can copy a chain or selection of chains by highlighting and pressing B. -- You can cut or delete a chain or selection of chains by highlighting and pressing B+A. -- Make a big selection by pressing LT+B, then DPAD around to highlight. -- Press LT+A to paste. -- You can jump the cursor to the next/previous chain in a column by pressing LT+DOWN/UP - -## Chain Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140447738_chain_1.1f.png) - -- The three columns of the phrase screen, from left to right: (red) row counter, phrase list, and transpose. -- Chains are made up of phrases. Each hex number in the second column represents a phrase. -- You can navigate to any of those phrases by putting your cursor on one and hitting RT+R. -- The rightmost column is transpose. If you use very high numbers like FF the phrase on that row will transpose down. Low numbers like 04 will cause the phrase on that row to transpose up. -- you can jump to previous / next chain on the row with with B+LEFT/RIGHT -- You can make a new phrase by hitting A,A on a blank space in the Chain screen. -- You can clone a phrase by highlighting it with the cursor and pressing LT+(B,A). -- You can copy a phrase/transposition/selection by highlighting and pressing B. -- You can cut or delete a phrase/transposition/selection by highlighting and pressing B+A. -- Make a big selection by pressing LT+B, then DPAD around to highlight. -- Press LT+A to paste. - -## Phrase Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140464770_phrase_1.1f.png) - -- The top of the phrase screen displays the .wav file loaded into the instrument under your cursor. The left of the phrase screen is the play-time visualizer. -- The seven columns of the phrase screen, from left to right: (red) row counter, note trigger, instrument selector, effect one, parameters for effect one, effect two, parameters for effect two. -- You can clone instruments and tables in the phrase screen: LT+(B,A) as usual. You can get a new table or instrument: A,A. -- If you copy/cut anything in the phrase screen, pasting will always put the data back in the same column (regardless if you've moved the cursor to another column). so effects in column one are always pasted back there, and you can't accidentally paste a note into the effect column, etc. -- you can clone a MIDI instrument in the phrase screen by pressing L_TRIGGER+(B,A) on instrument number in phrase screen. Properly saved & restored. You can't delete them once cloned (can't revert them to sample type). -- If no instrument is set when triggering a new note, tables are not stopped, running commands are not stopped and phase of oscillator instrument is not reset (allowing for clickless transition) - -## Instrument Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140478226_instrument_1.1f.png) - -- **sample:** selects the .wav file to associate with the instrument. you can select the same sample in more than one instrument. if you tap A,A here it will take you to the Sample Import Screen (which lets you load new .WAV into your project). -- **volume:** -- **pan:** pans the instrument left or right (0x7F is center) -- **root note** -- **drive:** This is a volume modification before crush, and the instruments volume is after the crush. -- **crush:** decrease bit resolution -- **downsample:** decrease the bit rate, get those low frequency aliasing whines. each increase in this value will downsample the original sample by a factor of 2 -- **cutoff:** filter cutoff frequency -- **reso:** filter resonance frequency -- **type:** this is where it gets a little trickier. The filter now supports continuous change from low pass to high pass. set type to 00 for low pazz. FF for hi-pass and 7f for Band pass (or is it notch? n0s must check). all intermediate values morph in between them. -- **dist:** filter distortion. for the moment we have none & scream. i'm planning on maybe add a third choice that would make the filter behave a little better when resonance is set very high in the old/default mode -- **fb tune:** length of the feedback delay line -- **fb mix:** how much of the feedback is pushed back in the circuit - -The feedback pickup is at the very end of the chain, after the filter has been processed. It makes it very depending on volume, filter settings, etc… but makes it more organic too. After pickup, it stays in a delay line of variable length (through the tune parameter) and is mixed back with the current sample value, before crush, filter and so on. I've found it very nice to fatten oscillators and give some kind of a nice warm-distorted bass sounds. -The feedbacktune parameter works a little differently in regular (one shot/loop) and in oscillator mode: -In regular modes, under 0x80, it delays the feedback pickup of a number of samples equivalent to the parameter. Over 0x80, the feedback line length is multiplied by 10, giving it more a sort of 'predelay'-ish character that works very well with short decayed sounds -In oscillator modes, under 0x80 the feedback of specified length is added to the oscillator. Over 0x80 it is removed from the oscillator, making it a lot wilder. - -- **interpolation:** Interpolation mode ('linear'/'none'): selects which interpolation mode is used when in between samples. linear interpols linearly while none takes the nearest neighbor. Use none when playing samples at low range to add some typical overtones. -- **loop mode:** selects the looping mode. - - none will play sample from zero to end. - - loop will start at zero and loop from loopstart to end. - - looper sync will automatically tune a loop so that it plays exactly 16 bars. Use the root note to play twice faster/slower - - oscillator is a special mode where the loop selection (from loopstart to end) is taken as oscillator data and automatically tuned. Experiment with different settings, do not forget 'root note' is your friend to tune the oscillator back in a useful range -- **start:** start point of the sample regardless of if loop is enabled; in hex -- **loop Start:** start point of the sample when loop is enabled; in hex -- **loop End:** end point of the sample; in hex. You can play samples backwards by setting the end value lower than the start! -- **automation:** If On, the table play arrows will advance one row every time the instrument is triggered, and execute only the commands on the new rows. If this is Off, table behavior is normal (play arrows cruise around real fast). -- **table:** Select a table the instrument will always run. Clone a table here: LT+(B,A). Make a new table here: A,A. - -## Sample Import Screen - -**NOTE: THE NEWEST GHETTOS HAVE A NEW SAMPLE BROWSER. THIS APPLIES TO PRE 1.0 VERSIONS.** -accessible by hitting A,A on the “sample” parameter in the Instrument Screen. -The samples of the library have to be located in a folder samplelib at the same level as the song folders (lgpt-xxxx). you can either put your samples in that directory or in sub-directories, allowing you to have some basic way of sorting the library. For example: - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140496106_sample_import_1.1f.png) - - -When entering the import screen, the current folder is the library root folder “samplelib”. All sample in that folder are listed. -Use U/D to select a sample and 'A' to load it -B+L/R to rotates between all sub directories. -In the latest ghetto, hitting 'A,A“ will bring up a sample loader pop-up screen, use the cursor to select directories and samples, and chose “listen” to play the sample, “import” to add it to your project, or “exit” to return the instrument screen. - -## Midi Instrument Screen -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140537386_midi_1.1f.png) - - -Midi can be enabled on many platforms through simple software configs in your OS, or through the construction of platform specific hardware. More info about this can be found [**here**](http://wiki.littlegptracker.com/doku.php?id=lgpt:midi) - -A midi instrument has the following settings: - -- **Channel** - This can be set 0x80 to 0x8F which is midi channel 1-16 respectively -- **Volume** - The volume any NOTE ON will be sent to your device. FF=127, 00=00 -- **Length** - Sets note gate length in number of ticks. -- **Automation** - On, the table play arrows will advance one row every time the instrument is triggered, and execute only the commands on the new rows. If this is Off, table behavior is normal (play arrows cruise around real fast). -- **Table**- As above, select a table the instrument will always run. Clone a table here: LT+(B,A). Make a new table here: A,A. - -## Table Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140549562_table_1.1f.png) - -- Hopping to self in table holds the step for x ticks. For example - -05 HOP 1005 -will hold step 5 for 10 ticks. Interesting for example after a VOLM command to allow complex envelopes: -00 VOLM 0400 ; starts short volume decay to zero 01 HOP 1010 ; holds enough ticks for VOLM to complete 02 VOLM 0560 ; raise volume to 60 03 HOP 6003 ; hold for a long time to allow VOLM to ; complete and hold volume to 60 - -- After Hopping count is reached, the table pointer moves directly to the line after - -the HOP rather than staying on the HOP line for one tick. Makes more sense. - -## Groove Screen - -![](https://d2mxuefqeaa7sj.cloudfront.net/s_B9C92C3440E8671360862F10CAB0FE70873BFE49CFB51CA246C781C17506C258_1522140567776_groove_1.1f.png) - -Groove screen is located on top of the phrase screen. Groove lets you rock some swing to bust funky beats. -To grasp groove you must first you must know what a tick is, and a tick is simply a constant measurement of time. By default, every row of a phrase (aka step) gets 6 ticks, that's why you see two sixes when you go to the groove screen. But say you change the first 6 to a 1. Now, every other step lasts for 1 tick (which is shorter than 6 ticks). -To get a handle on this, try a groove of 1/F and watch the play arrow in a phrase. You'll notice the play arrow hanging around on the odd steps longer than the even ones. Then try a groove of 1/1/F and go back to the phrase screen. You'll see the play arrow hanging on every third step. Once you grasp how the groove screen effects the play arrow, you can move to more subtle values or keep the beat way freaked out! -In the groove screen there is no copy paste (yet) but the following action exists: - -- A: Adds a new step if not existing -- A+L/R: modifies current step value -- B+L/R/U/D: modifies current edited groove -- B+A: Clear current step - -the GROV command (only active in the phrase screen) select the current groove - -# Commands - -There can be two commands on every row of the phrase screen. Commands which effect instruments can be run on any step of the instruments playback, including the step where the instrument is triggered. -in vol; pitch and kill but the definition of the “time' is slightly different for all command… - -## ARPG abcd - -**cycle through relative pitches a, b, c, and d (starting with original pitch, then up a semitones, b semitones and so forth). The cycle loops if there's only zero's past a given post** -Examples: -ARPG 3000: loops between original pitch and +3 semitones -ARPG 4050: loops between original pitch, +4 semitones, +0 semitones, + 5 semitones - -- speed of arpeggiator is constant and can not be changed -## CRSH aabb - -**aa = pre crush drive (from 1 to 0xFF, 00 is no change) & bb = crush setting (from 0 to 0xF, 0x0 is 1 bit, 0xF is 16bit )** - -## DLAY --bb - -**Delays the note to be played by bb tics** - -## FCUT aabb - -**adjust the filter cutoff to bb at speed aa** - -- FCUT 0080 will instantly set the filter cutoff to 50% -- FCUT 1000 will close the filter entirely at speed 10 -## FLTR aabb - -**lowpass filter, set absolute frequency value for cutoff aa & resonance bb** - -- FLTR 00FF is un-adultered sound -## FRES aabb - -**adjust the filter resonance to bb at speed aa** - -- FRES 08FF will raise the resonance to screeching at speed 08 -## FBMX aabb - -**go to feedback mix xxbb at aaxx speed** - -## FBTN aabb - -**go to feedback tune xxbb at aaxx speed** - -## HOP aabb - -**play position will jump to the next phrase in a chain, jumping directly at position bb in the phrase.** - -- hop is instant: instrument triggers and commands on the same row will be run. -- no effect on instruments -- in [TABLES](file:///C:/Users/naray/Downloads/lgpt%20reference_manual.html#table_screen), cursor position will jump to row bb aa times, then pass thru the hop command and continue thru the rest of the table - -## IRTG aabb - -IRTG stands for Instrument Retrigger and will retrigger the current instrument. It gives table the ability to work as progammable phrases that then can be triggered simply by changing tables. -IRTG –bb will retrigger the current instrument transposed by bb semi-tones. Note that each IRTG transposition is cumulatively added. So a table with -IRTG 0001 -will keep going a semi tone up. Great for dubby echoes :) -The retriggered instrument is NOT reset (as if you enter a note with no instrument number). The table (obviously) will continue to run and all running variable (filter,etc) won't be reset. -This system is also pretty useful to implement temporary non 4/4 signature without having to switch grooves, since you have the ability to re-trigger the instrument at tick resolution -don't forget trying to combine it with complex hop structure ! - -## KILL --bb - -**instrument will stop playing after aa ticks.** - -## LEGA aabb - -**performs an exponential pitch slide from previous note value to pitch bb at speed aa.** - -- 00 is the fastest speed for aa (instant, useless) -- bb values are relative: 00-7F are up, 80-FF are down, expressed in semi-tones -- if LEGA is put on a row where a note is present and the pitch offset is 0 (e.g. `C4 I3 LEGA 1000`) the slide will occur automatically from previous note to the current one at the given speed. -- If an instrument is not triggered on the same row as LEGA, the command will re-trigger the previous instrument (unless the previous instrument is still playing). -- LEGA does exponential pitch change (i;e. it goes at same speed through all octaves) while PITCH is linear - -## LPOF aaaa - -**LooP OFset: Shift both the loop start & loop end values aaaa digits** - -- LPOF 0001 adds one to both values, LFOF FFFF removes one (so values > 0x800 moves the loop backward) -- reset everytime you start a new note (same as volume, pitch) -- LPOF is absolute -- you can't trigger a note with the LPOF, it has to be executed after a sample is playing -- every time you trigger a sample LPOF is set back to the instrument parameters -## MDCC aabb - -**Sends a MIDI “continuous control” message. aa is the control number and bb is the value. It will be sent on the MIDI channel of the currently running instrument.** - -## MDPG --bb - -sends a program change command on the current channel. 0000 is program change 1 - -## PAN aabb - -**PAN aabb: where bb is the pan destination and aa is the speed to get there** - -## PFIN aabb - -**PitchFINetune: where bb is the width and aa is the speed to get there** - -- Tunes the root note one semitone up (01-80) or down (FF-81) -- 00 in bb returns the note to the root center -- 00 is the fastest speed for aa - -## PLOF aabb - -**PLayOFfset virtually cuts any sample in 256 chunks. jump absolutely to chunk aa or relatively move forward/back bb chunks.** - -## PTCH aabb - -- PTCH is also time for the first two byte nibble -- PITCH is linear pitch change - -## RTRG aabb - -**retrigger the sound by looping the from current play position over a certain amount of ticks.** - -- aa allows to move the loop forward of aa ticks each time the loop has been done (loop offest per retrigger) -- bb is the number of ticks used for the looping (speed of retrigger effect) - -RTRG 0001: loop one tick from current play position -RTRG 0102: loop of two ticks but move the loop one tick every loop -RTRG 0101: does not do anything because after looping one tick, you move forward one tick and therefore go back to the current position :) - -## TABL --bb - -**triggers table bb** - -## TMPO --bb - -**sets the tempo to hex value –bb.** - -- TMPO 0000 is safe and doesn't effect the tempo at all. -- TMPO 003C (60bpm) is the lowest acceptable value and TMPO 0190 (400bpm) is the highest acceptable value - -## VOLM aabb - -**starting from the instrument's volume setting, approach volume bb at speed aa. 00 is the lowest volume and 00 is the fastest speed (instant).** - -- to achieve sounds that grow in volume, make an instrument with volume 0 and then apply the VOLM command - -# Rendering - -Some people exploit the analog gap between their device's headphone output and whatever they are recording with. Alternately, you can start piggy in rendering mode so it will output 16bit, 44100Hz .WAV files. -Please note that RENDER mode is not intended to be functional on the GP2X Builds. -The following values can set for RENDER in the config.xml: - -- Standard mode: audio is played; no render. -- FILE: File rendering: Full speed (no audio) rendering of the stereo mixdown. -- FILESPLIT: File split rendering: Full speed (no audio) rendering of each channel separately. -- FILERT: Real Time file rendering: Renders the mixdown to file WHILE playing audio. This allow to render live mode tweaks directly. -- FILESPLITRT: Real Time file split: same except all channels are rendered separately. - -Here is an example of the proper XML syntax: (See [The config.xml setup guide](http://wiki.littlegptracker.com/doku.php?id=lgpt:config)) - -``` - -``` - -Remember, any of the config.xml parameters can be specified to lgpt on the command line in this fashion: - -``` -lgpt -RENDER=FILE -``` \ No newline at end of file diff --git a/docs/wiki/What-is-LittleGPTracker.md b/docs/wiki/What-is-LittleGPTracker.md index 2e07c97c..e06b6b29 100644 --- a/docs/wiki/What-is-LittleGPTracker.md +++ b/docs/wiki/What-is-LittleGPTracker.md @@ -1,14 +1,14 @@ # What is LittleGPTracker? -[*LittleGPTracker*](http://www.10pm.org/nostromo/lgpt/) *(a.k.a piggy tracker) is a sample based tracker originally programed for the gamepark handhelds and PSP but now also available for Microsoft Windows and ~~Mac OSX~~. It implements a user interface similar to the refined track-by-joypad software* [*littlesounddj*](http://www.littlesounddj.com/)*. Piggy currently supports 8 monophonic 8Bit/16Bit/44.1Khz stereo channels as well as 16 channel midi output. Piggy is currently under development and the latest versions of the program (along with unstable ghetto builds) can be found at* [*https://github.com/djdiskmachine/LittleGPTracker/releases/*](https://github.com/djdiskmachine/LittleGPTracker/releases/)*.* +[*LittleGPTracker*](http://www.10pm.org/nostromo/lgpt/) *(a.k.a piggy tracker) is a sample based tracker originally programed for the gamepark handhelds and PSP but now also available for Microsoft Windows and ~~Mac OSX~~. It implements a user interface similar to the refined track-by-joypad software* [*littlesounddj*](http://www.littlesounddj.com/)*. Piggy currently supports 8 monophonic 8Bit/16Bit/44.1Khz stereo channels as well as 16 channel midi output. Piggy is currently under development and the latest versions of the program (along with beta builds) can be found at* [*https://github.com/djdiskmachine/LittleGPTracker/releases/*](https://github.com/djdiskmachine/LittleGPTracker/releases/)*.* You are reading a reference manual for those who are comfortable with LSDj or trackers in general. An alternative introduction to LittleGPTracker is our very own [quick_start_guide](https://web.archive.org/web/20170310001122/wiki.littlegptracker.com/doku.php?id=lgpt:quick_start_guide). If you have a question this manual does not answer, please join the [Discord](https://discord.com/invite/NMQVbrFgr3) or in #hexawe on efnet. Don't forget to check out the advanced [tips_tricks](https://web.archive.org/web/20170310001122/wiki.littlegptracker.com/doku.php?id=lgpt:tips_tricks) If you want to grab some sounds to get off the ground quickly, or want to hear and see what other people have been doing with piggy tracker, download some of the .zip archives from [http://hexawe.net](http://hexawe.net/)! # Files ## Installation -Grab the installation package for your platform from the [download page](http://www.10pm.org/nostromo/lgpt/download.php). Extract the files from the archive & copy it where you like. after that you can run the executable type for your system, located in the lgpt root or in the /bin folder. linux users may need to set the binary as executable (chmod a+x lgpt.deb-exe). +Grab the installation package for your platform from the [download page](https://github.com/djdiskmachine/LittleGPTracker/releases/). If the package contains an INSTALL_HOW_TO.txt, follow those instructions. Otherwise, extract the files from the archive & copy it where you like. After that you can run the executable type for your system, located in the lgpt root or in the /bin folder. linux users may need to set the binary as executable (chmod a+x lgpt.deb-exe). If you're using PPSSPP, LittleGPTracker might boot with a black screen. To workaround -this, set Software rendering **or** change rendering resolution +this, set Software rendering **or** change rendering resolution after LGPT has started ## Directory Structure - **bin** @@ -16,10 +16,10 @@ this, set Software rendering **or** change rendering resolution - **SDL.dll** … dependency - **stderr.txt** … debugging output file (created at startup and removed upon exit) - **stdout.txt** … debugging output file (created at startup and removed upon exit) -- **docs** - - **readme.txt** … credits and links to piggy resources - - **revision.txt** … version history, describes how new features work if they're not included in the manual yet -- **lgpt10k** … Project folder to the author's entry for the [10k compo](http://www.10pm.org/nostromo/lgpt/10k.php) (M-.-n : Tardline) Note: all projects start with lgpt* +- **README.txt** … credits and changelog +- **config_xml.md** … config.xml documentation +- **INSTALL_HOW_TO.txt** … How to install for tricky systems +- **BETA** … Example song by djdiskmachine showcasing some new featres. Note: all projects start with lgpt_* - **Samples** … each project loads wav files from it's own Samples directory - **lgptsav.dat** … all projects store their data in xml files called lgptsav.dat - **lgptNew** … another piggy project, following the lgpt* naming convention for projects @@ -65,12 +65,12 @@ Important Points to Remember: ## config.xml The config file is used to tweak certain global parameters of the application. It is not mandatory to have one but it will allow you to change key mapping, color scheme, key repeat setting and other. -For more details check out the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config) page +For more details check out the [config](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/config_xml.md) page # Controls & Moves -If you want to change the default mapping in LGPT, you will want to edit the confiq.xml. More information can be found on this on the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config) -If you want to augment the mapping controls to add a usb footpedal, another joystick, macros using additional buttons on your device, or even control of piggy via midi commands, check out [mapping](http://wiki.littlegptracker.com/doku.php?id=lgpt:mapping) +If you want to change the default mapping in LGPT, you will want to edit the config.xml. More information can be found on this on the [config](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/config_xml.md) +If you want to augment the mapping controls to add a usb footpedal, another joystick, macros using additional buttons on your device, or even control of piggy via midi commands, check out [mapping](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/mapping_xml.md) ## Key Mapping @@ -82,7 +82,7 @@ If you want to augment the mapping controls to add a usb footpedal, another joys - RT: Right trigger (shoulder button). - LT: Left trigger (shoulder button). -*GP2X Specific notice*: The A & B buttons are “inverted” (when compared to GP32 and LSDJ on Gameboy). This can be modified in the [config](http://wiki.littlegptracker.com/doku.php?id=lgpt:config). +*GP2X Specific notice*: The A & B buttons are “inverted” (when compared to GP32 and LSDJ on Gameboy). This can be modified in the [config](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/config_xml.md). The moves are close to what you would pull in lsdj, but shoulder buttons replace the lsdj SELECT key. Most of the time, the equivalent of SELECT is the shoulder button opposite the other buttons you're pushing. For example SELECT+B is LT+B, SELECT+RIGHT is RT+RIGHT. @@ -340,7 +340,7 @@ In oscillator modes, under 0x80 the feedback of specified length is added to the - pingpong will start at "start" and bounce the loop between loop start and loop end. - oscillator is a special mode where the loop selection (from loop start to loop end) is taken as oscillator data and automatically tuned. Experiment with different settings, do not forget 'root note' is your friend to tune the oscillator back in a useful range - looper sync will automatically tune a loop so that it plays exactly 16 bars. Use the root note to play twice faster/slower - - slicer will cut the sample into "slices" amount of samples, mapped from C-2 up to amount of slices + - slicer will cut the sample into "slices" amount of samples, mapped from C-2 (the lowest possible note) up to amount of slices. Example: slices == 4 will give you four slices mapped to C-2, C#-2, D-2, D#-2 - **start:** start point of the sample regardless of if loop is enabled; in hex - **loop Start:** start point of the sample when loop is enabled; in hex - **loop End:** end point of the sample; in hex. You can play samples backwards by setting the end value lower than the start! @@ -561,7 +561,7 @@ The following values can set for RENDER in the config.xml: - FILERT: Real Time file rendering: Renders the mixdown to file WHILE playing audio. This allow to render live mode tweaks directly. - FILESPLITRT: Real Time file split: same except all channels are rendered separately. -Here is an example of the proper XML syntax: (See [The config.xml setup guide](http://wiki.littlegptracker.com/doku.php?id=lgpt:config)) +Here is an example of the proper XML syntax: (See [The config.xml setup guide](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/config_xml.md)) ``` @@ -571,4 +571,4 @@ Remember, any of the config.xml parameters can be specified to lgpt on the comma ``` lgpt -RENDER=FILE -``` \ No newline at end of file +``` diff --git a/docs/wiki/config_xml.md b/docs/wiki/config_xml.md index af5e21e8..0bf41fca 100644 --- a/docs/wiki/config_xml.md +++ b/docs/wiki/config_xml.md @@ -56,12 +56,17 @@ Be careful as large values take a lot of juice and interfere with sound playback ## Screen Colors -LittleGPTracker uses 4 colours to do all the drawing. If you want, you can redefine them using the following parameters: +LittleGPTracker uses 6 colours to do all the drawing. If you want, you can redefine them using the following parameters: - `BACKGROUND`: color of the background - `FOREGROUND`: color of the foreground - `HICOLOR1`: row count in song screen - `HICOLOR2`: cursor color +- `SONGVIEW_FE`: color of the chain "FE" in song screen +- `SONGVIEW_00`: color of the chain "00" in song screen +- `ROWCOLOR1`: Row count color 1 +- `ROWCOLOR2`: Row count color 2 +- `ALTROWNUMBER`: How many rows for each rowcolor All colors are defined by a set of hexadecimal triplet for RGB. Here's an example: @@ -69,8 +74,14 @@ All colors are defined by a set of hexadecimal triplet for RGB. Here's an exampl - - + + + + + + + + ``` @@ -120,7 +131,7 @@ Here's an example that maps the start button to the X on PSP: ``` -And if you want to configure a USB joypad, you'll have to use the [mapping.xml](https://wiki.littlegptracker.com/doku.php?id=lgpt:mapping "lgpt:mapping") +And if you want to configure a USB joypad, you'll have to use the [mapping.xml](https://github.com/djdiskmachine/LittleGPTracker/blob/master/docs/wiki/mapping_xml.md "lgpt:mapping") ## Auto repeat @@ -197,7 +208,7 @@ This setting is also W32 only. It can be use to delay the output of midi by a ce also note: Because MIDI on PC is a bitch to synchronise and that the ONLY system that kind of worked was, surprisingly, the old MMSYSTEM audio system, I've re-enabled it as an option. So, if you need good midi sync or good timing, you will NEED to use this. The latency isn't great but in our case it's not a problem. To enable the old ass audio system and enjoy pretty stable midi out, add an entry in the config.xml with -##Log Dumping +## Log Dumping Get piggy dumping a log on the terminal or to a .log file, useful for debugging crashes or making a mapping.xml for your usb pad: diff --git a/projects/resources/CHIP/config.xml b/projects/resources/CHIP/config.xml index d6edf70e..9265752c 100644 --- a/projects/resources/CHIP/config.xml +++ b/projects/resources/CHIP/config.xml @@ -23,4 +23,13 @@ + + + + + + + + + diff --git a/projects/resources/DEB/config.xml b/projects/resources/DEB/config.xml index 7c26fec6..f47f24e5 100644 --- a/projects/resources/DEB/config.xml +++ b/projects/resources/DEB/config.xml @@ -1,13 +1,6 @@ - - ---> + + + + + + + + + + + + diff --git a/projects/resources/MIYOO/config.xml b/projects/resources/MIYOO/config.xml index 78d6ae00..e3905c70 100644 --- a/projects/resources/MIYOO/config.xml +++ b/projects/resources/MIYOO/config.xml @@ -14,4 +14,16 @@ root of your sd card. + + + + + + + + + + + + diff --git a/projects/resources/config.xml b/projects/resources/config.xml index 7bf644fb..3df3fcb1 100644 --- a/projects/resources/config.xml +++ b/projects/resources/config.xml @@ -20,4 +20,16 @@ + + + + + + + + + + + + diff --git a/projects/resources/packaging/config.xml b/projects/resources/packaging/config.xml new file mode 100644 index 00000000..a8acafe2 --- /dev/null +++ b/projects/resources/packaging/config.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/resources/packaging/lgpt_package.sh b/projects/resources/packaging/lgpt_package.sh index 4546b576..0972751f 100755 --- a/projects/resources/packaging/lgpt_package.sh +++ b/projects/resources/packaging/lgpt_package.sh @@ -1,7 +1,7 @@ #!/bin/bash cd $(git rev-parse --show-toplevel)/projects/ BUILD="$(grep -oP 'BUILD_COUNT [^"]*"\K[^"]*' ../sources/Application/Model/Project.h)" -VERSION=1.3o$BUILD +VERSION=1.3o_$BUILD PACKAGE=LGPT-$VERSION.zip collect_resources() { #1PLATFORM #2lgpt.*-exe @@ -25,6 +25,7 @@ collect_resources() { #1PLATFORM #2lgpt.*-exe CONTENTS="README.txt samplelib/ lgpt_BETA/" zip -9 -r ../../$PACKAGE $CONTENTS CONTENTS="../../../docs/wiki/What-is-LittleGPTracker.md" + CONTENTS+=" ../../../docs/wiki/config_xml.md" CONTENTS+=" ../$1/*.txt" zip -9 ../../$PACKAGE -j $CONTENTS && cd - } diff --git a/sources/Application/AppWindow.cpp b/sources/Application/AppWindow.cpp index 76dd5611..143ccdd3 100644 --- a/sources/Application/AppWindow.cpp +++ b/sources/Application/AppWindow.cpp @@ -20,10 +20,15 @@ AppWindow *instance=0 ; GUIColor AppWindow::backgroundColor_(0x1D,0x0A,0x1F); GUIColor AppWindow::normalColor_ (0xF5,0xEB,0xFF); +GUIColor AppWindow::songviewfeColor_(0xA5,0x5B,0x8F); +GUIColor AppWindow::songview00Color_(0x85,0x3B,0x6F); GUIColor AppWindow::highlightColor_ (0xB7,0x50,0xD1); GUIColor AppWindow::highlight2Color_(0xDB,0x33,0xDB); GUIColor AppWindow::consoleColor_ (0x00,0xFF,0x00); GUIColor AppWindow::cursorColor_ (0xFF,0x00,0x8C); +GUIColor AppWindow::rownumberColor_ (0xBA,0x28,0xF9); +GUIColor AppWindow::rownumber2Color_(0xFF,0x00,0xFF); + int AppWindow::charWidth_=8; int AppWindow::charHeight_=8 ; @@ -93,9 +98,13 @@ AppWindow::AppWindow(I_GUIWindowImp &imp):GUIWindow(imp) { defineColor("BACKGROUND",backgroundColor_) ; defineColor("FOREGROUND",normalColor_) ; + defineColor("SONGVIEW_FE",songviewfeColor_) ; + defineColor("SONGVIEW_00",songview00Color_) ; defineColor("HICOLOR1",highlightColor_) ; defineColor("HICOLOR2",highlight2Color_) ; defineColor("CURSORCOLOR",cursorColor_) ; + defineColor("ROWCOLOR1",rownumberColor_); + defineColor("ROWCOLOR2",rownumber2Color_); GUIWindow::Clear(backgroundColor_) ; @@ -234,7 +243,18 @@ void AppWindow::Flush() { case CD_CURSOR: gcolor=cursorColor_ ; break ; - + case CD_SONGVIEWFE: + gcolor = songviewfeColor_; + break; + case CD_SONGVIEW00: + gcolor = songview00Color_; + break; + case CD_ROW: + gcolor = rownumberColor_; + break; + case CD_ROW2: + gcolor = rownumber2Color_; + break; default: NAssert(0) ; break ; diff --git a/sources/Application/AppWindow.h b/sources/Application/AppWindow.h index 704a4eea..bd270b25 100644 --- a/sources/Application/AppWindow.h +++ b/sources/Application/AppWindow.h @@ -91,10 +91,14 @@ class AppWindow:public GUIWindow,I_Observer,Status { static GUIColor backgroundColor_ ; static GUIColor normalColor_ ; + static GUIColor songviewfeColor_ ; + static GUIColor songview00Color_ ; static GUIColor highlight2Color_; static GUIColor highlightColor_; static GUIColor consoleColor_; static GUIColor cursorColor_; + static GUIColor rownumberColor_; + static GUIColor rownumber2Color_; ColorDefinition colorIndex_ ; diff --git a/sources/Application/Model/Project.h b/sources/Application/Model/Project.h index 79dcfee3..77f02e87 100644 --- a/sources/Application/Model/Project.h +++ b/sources/Application/Model/Project.h @@ -17,7 +17,7 @@ #define PROJECT_NUMBER "1.3" #define PROJECT_RELEASE "o" -#define BUILD_COUNT "-1" +#define BUILD_COUNT "2" #define MAX_TAP 3 diff --git a/sources/Application/Utils/HelpLegend.h b/sources/Application/Utils/HelpLegend.h index 2c9a64ab..edb1a9ec 100644 --- a/sources/Application/Utils/HelpLegend.h +++ b/sources/Application/Utils/HelpLegend.h @@ -5,104 +5,131 @@ #include #include -static inline std::string* getHelpLegend(char* fx) { +static inline std::string* getHelpLegend(FourCC command) { std::string* result = new std::string[3]; - result[0].assign(fx); result[2].assign("bb at speed aa"); - if (strcmp(fx, "KILL") == 0) { - result[0].append(", KILl:--bb"); - result[1].assign("stop playing"); - result[2].assign("after bb ticks"); - } else if (strcmp(fx, "LPOF") == 0) { - result[0].append(", LooP OFset: Shift both"); - result[1].assign("the loop start & loop "); - result[2].assign("end values aaaa digits"); - } else if (strcmp(fx, "ARPG") == 0) { - result[0].append(", ARPeGgio: Cycle"); - result[1].assign("through relative pitches"); - result[2].assign("from original pitch"); - } else if (strcmp(fx, "VOLM") == 0) { - result[0].append(", VOLuMe:aabb"); - result[1].assign("approach volume"); - } else if (strcmp(fx, "PTCH") == 0) { - result[0].append(", PiTCH:aabb"); - result[1].assign("approach pitch"); - } else if (strcmp(fx, "HOP ") == 0) { - result[0].append(":aabb"); - result[1].assign("hop to bb"); - result[2].assign("aa times"); - } else if (strcmp(fx, "LEGA") == 0) { - result[0].append(", LEGAto: slide from"); - result[1].assign("previous note to pitch"); - } else if (strcmp(fx, "RTRG") == 0) { - result[0].append(", ReTRiG: retrigger loop"); - result[1].assign("from current position over"); - result[2].assign("bb ticks at speed aa"); - } else if (strcmp(fx, "TMPO") == 0) { - result[0].append(", TeMPO:--bb"); - result[1].assign("sets the tempo to hex"); - result[2].assign("value bb"); - } else if (strcmp(fx, "MDCC") == 0) { - result[0].append(", MiDiCC:aabb"); - result[1].assign("CC message aa"); - result[2].assign("value bb"); - } else if (strcmp(fx, "MDPG") == 0) { - result[0].append(", MiDi ProGram Change"); - result[1].assign("send program change bb"); - result[2].assign("to current channel"); - } else if (strcmp(fx, "PLOF") == 0) { - result[0].append(", PLay OFfset:aabb"); - result[1].assign("jump abs to aa or"); - result[2].assign("move rel bb chunks"); - } else if (strcmp(fx, "FLTR") == 0) { - result[0].append(", FiLTeR:aabb"); - result[1].assign("cutoff aa"); - result[2].assign("resonance bb"); - } else if (strcmp(fx, "TABL") == 0) { - result[0].append(", TABLe:--bb"); - result[1].assign("trigger table bb"); - result[2].assign(""); - } else if (strcmp(fx, "CRSH") == 0) { - result[0].append(", drive&CRuSH:aa-b"); - result[1].assign("drive aa"); - result[2].assign("crush -b"); - } else if (strcmp(fx, "FCUT") == 0) { - result[0].append(", FilterCUToff:aabb"); - result[1].assign("set cutoff to"); - } else if (strcmp(fx, "FRES") == 0) { - result[0].append(", FilterRESonance:aabb"); - result[1].assign("set resonance to"); - } else if (strcmp(fx, "PAN ") == 0) { - result[0].append("PAN:aabb"); - result[1].assign("pan to value"); - } else if (strcmp(fx, "GROV") == 0) { - result[0].append(", GROoVe:--bb"); - result[1].assign("trigger groove bb"); - result[2].assign(""); - } else if (strcmp(fx, "IRTG") == 0) { - result[0].append(", InstrumentReTriG:aabb"); - result[1].assign("retrig and transpose to"); - } else if (strcmp(fx, "PFIN") == 0) { - result[0].append(", PitchFINetune:aabb"); - result[1].assign("fine tune to "); - } else if (strcmp(fx, "DLAY") == 0) { - result[0].append(", DeLAY:--bb"); - result[1].assign("delay bb tics"); - result[2].assign(""); - } else if (strcmp(fx, "FBMX") == 0) { - result[0].append(", FeedBack MiX:aabb"); - result[1].assign("feedback mix to"); - } else if (strcmp(fx, "FBTN") == 0) { - result[0].append(", FeedBack TuNe:aabb"); - result[1].assign("feedback tune to"); - } else if (strcmp(fx, "STOP") == 0) { - result[0].append(" playing song"); - result[1].assign("immediately"); - result[2].assign(""); - } else { - result[0].assign(""); - result[1].assign(""); - result[2].assign(""); + switch (command) { + case I_CMD_KILL: + result[0].assign("KILl:--bb"); + result[1].assign("stop playing note"); + result[2].assign("after bb ticks"); + break; + case I_CMD_LPOF: + result[0].assign("LooP OFset: Shift both"); + result[1].assign("the loop start & loop "); + result[2].assign("end values aaaa digits"); + break; + case I_CMD_ARPG: + result[0].assign("ARPeGgio:abcd Cycle"); + result[1].assign("through relative pitches"); + result[2].assign("from original pitch"); + break; + case I_CMD_VOLM: + result[0].assign("VOLuMe:aabb"); + result[1].assign("approach volume"); + break; + case I_CMD_PTCH: + result[0].assign("PiTCH:aabb"); + result[1].assign("approach pitch"); + break; + case I_CMD_HOP: + result[0].assign("HOP:aabb"); + result[1].assign("hop to bb"); + result[2].assign("aa times"); + break; + case I_CMD_LEGA: + result[0].assign("LEGAto: slide from"); + result[1].assign("previous note to pitch"); + break; + case I_CMD_RTRG: + result[0].assign("ReTRiG:aabb retrigger loop"); + result[1].assign("from current position over"); + result[2].assign("bb ticks at speed aa"); + break; + case I_CMD_TMPO: + result[0].assign("TeMPO:--bb"); + result[1].assign("sets the tempo to hex"); + result[2].assign("value bb"); + break; + case I_CMD_MDCC: + result[0].assign("MiDiCC:aabb"); + result[1].assign("CC message aa"); + result[2].assign("value bb"); + break; + case I_CMD_MDPG: + result[0].assign("MiDi ProGram Change"); + result[1].assign("send program change bb"); + result[2].assign("to current channel"); + break; + case I_CMD_PLOF: + result[0].assign("PLay OFfset:aabb"); + result[1].assign("jump abs to aa or"); + result[2].assign("move rel bb chunks"); + break; + case I_CMD_FLTR: + result[0].assign("FiLTer&Resonance:aabb"); + result[1].assign("cutoff aa"); + result[2].assign("resonance bb"); + break; + case I_CMD_TABL: + result[0].assign("TABLe:--bb"); + result[1].assign("trigger table bb"); + result[2].assign(""); + break; + case I_CMD_CRSH: + result[0].assign("drive&CRuSH:aa-b"); + result[1].assign("drive aa"); + result[2].assign("crush -b"); + break; + case I_CMD_FCUT: + result[0].assign("FilterCUToff:aabb"); + result[1].assign("set cutoff to"); + break; + case I_CMD_FRES: + result[0].assign("FilterRESonance:aabb"); + result[1].assign("set resonance to"); + break; + case I_CMD_PAN_: + result[0].assign("PAN:aabb"); + result[1].assign("pan to value"); + break; + case I_CMD_GROV: + result[0].assign("GROoVe:--bb"); + result[1].assign("trigger groove bb"); + result[2].assign(""); + break; + case I_CMD_IRTG: + result[0].assign("InstrumentReTriG:aabb"); + result[1].assign("retrig and transpose to"); + break; + case I_CMD_PFIN: + result[0].assign("PitchFINetune:aabb"); + result[1].assign("fine tune to "); + break; + case I_CMD_DLAY: + result[0].assign("DeLAY:--bb"); + result[1].assign("delay bb tics"); + result[2].assign(""); + break; + case I_CMD_FBMX: + result[0].assign("FeedBack MiX:aabb"); + result[1].assign("feedback mix to"); + break; + case I_CMD_FBTN: + result[0].assign("FeedBack TuNe:aabb"); + result[1].assign("feedback tune to"); + break; + case I_CMD_STOP: + result[0].assign("STOP playing song"); + result[1].assign("immediately"); + result[2].assign(""); + break; + default: + + result[0].assign(""); + result[1].assign(""); + result[2].assign(""); + break; } return result; } diff --git a/sources/Application/Utils/RandomNames.h b/sources/Application/Utils/RandomNames.h index 1b6fdc9c..745734d1 100644 --- a/sources/Application/Utils/RandomNames.h +++ b/sources/Application/Utils/RandomNames.h @@ -32,19 +32,18 @@ static const std::string vrb[] = "Sleeper", "Skier", "Smile", "Yell", "Zoomer" }; +bool noSeed = true; //Wonky assignment because < C++11 std::vector adjectives_ (adj, adj + sizeof(adj) / sizeof(adj[0]) ); std::vector verbs_ (vrb, vrb + sizeof(vrb) / sizeof(vrb[0]) ); - -class RandomNames { - public: - RandomNames() { srand(uint(time(NULL))); } - std::string getRandomName(); -}; - // Generate a random name made in the format of: "adjective-verb" std::string getRandomName() { + if (noSeed){ + srand(uint(time(NULL))); + noSeed = false; + } + std::string adjective = adjectives_[rand() % adjectives_.size()]; std::string verb = verbs_[rand() % verbs_.size()]; @@ -53,7 +52,7 @@ std::string getRandomName() { verb = verbs_[rand() % verbs_.size()]; } - return (adjective + verb).c_str(); + return (adjective + verb); } #endif //_RANDOM_NAMES_H_ diff --git a/sources/Application/Views/BaseClasses/View.cpp b/sources/Application/Views/BaseClasses/View.cpp index a1748f1b..9bd0a7be 100644 --- a/sources/Application/Views/BaseClasses/View.cpp +++ b/sources/Application/Views/BaseClasses/View.cpp @@ -3,6 +3,7 @@ #include "Application/Player/Player.h" #include "Application/Utils/char.h" #include "Application/AppWindow.h" +#include "Application/Model/Config.h" #include "ModalView.h" bool View::initPrivate_=false ; @@ -10,6 +11,7 @@ bool View::initPrivate_=false ; int View::margin_=0 ; int View::songRowCount_ ;//=21 ; bool View::miniLayout_=false ; +int View::altRowNumber_ = 4; View::View(GUIWindow &w,ViewData *viewData): w_(w), @@ -24,6 +26,11 @@ View::View(GUIWindow &w,ViewData *viewData): View::margin_=0 ; songRowCount_=miniLayout_?16:22 ; + const char *altRowStr = Config::GetInstance()->GetValue("ALTROWNUMBER"); + if (altRowStr) { + altRowNumber_ = atoi(altRowStr); + } + initPrivate_=true ; } mask_=0 ; diff --git a/sources/Application/Views/BaseClasses/View.h b/sources/Application/Views/BaseClasses/View.h index 953d6bf3..ffd99a5e 100644 --- a/sources/Application/Views/BaseClasses/View.h +++ b/sources/Application/Views/BaseClasses/View.h @@ -53,7 +53,11 @@ enum ColorDefinition { CD_HILITE1, CD_HILITE2, CD_CONSOLE, - CD_CURSOR + CD_CURSOR, + CD_SONGVIEWFE, + CD_SONGVIEW00, + CD_ROW, + CD_ROW2 } ; enum ViewUpdateDirection { @@ -153,6 +157,7 @@ class View: public Observable { static int margin_ ; static int songRowCount_ ; static bool miniLayout_ ; + static int altRowNumber_; } ; #endif diff --git a/sources/Application/Views/ChainView.cpp b/sources/Application/Views/ChainView.cpp index 8dff27af..2b271e74 100644 --- a/sources/Application/Views/ChainView.cpp +++ b/sources/Application/Views/ChainView.cpp @@ -632,11 +632,11 @@ void ChainView::DrawView() { // Display row numbers - SetColor(CD_HILITE1) ; char row[3] ; pos=anchor ; pos._x-=3 ; for (int j=0;j<16;j++) { + ((j/altRowNumber_)%2)?SetColor(CD_ROW):SetColor(CD_ROW2); hex2char(j,row) ; DrawString(pos._x,pos._y,row,props) ; pos._y+=1 ; diff --git a/sources/Application/Views/GrooveView.cpp b/sources/Application/Views/GrooveView.cpp index 99aa48fc..e00ec8e4 100644 --- a/sources/Application/Views/GrooveView.cpp +++ b/sources/Application/Views/GrooveView.cpp @@ -145,11 +145,11 @@ void GrooveView::DrawView() { // Display row numbers - SetColor(CD_HILITE1) ; char buffer[6] ; pos=anchor ; pos._x-=3 ; for (int j=0;j<16;j++) { + ((j/altRowNumber_)%2)?SetColor(CD_ROW):SetColor(CD_ROW2); hex2char(j,buffer) ; DrawString(pos._x,pos._y,buffer,props) ; pos._y++ ; diff --git a/sources/Application/Views/ModalDialogs/ImportSampleDialog.cpp b/sources/Application/Views/ModalDialogs/ImportSampleDialog.cpp index 1e57ccc9..c9cfeb5a 100644 --- a/sources/Application/Views/ModalDialogs/ImportSampleDialog.cpp +++ b/sources/Application/Views/ModalDialogs/ImportSampleDialog.cpp @@ -211,7 +211,8 @@ void ImportSampleDialog::ProcessButtonMask(unsigned short mask,bool pressed) { bool ImportSampleDialog::isSampleLibRoot() { - return sampleLib_.GetPath().find(currentPath_.GetPath()) != std::string::npos; + // return sampleLib_.GetPath().find(currentPath_.GetPath()) != std::string::npos; // Causes issues in Win, Miyoo + return currentPath_.GetPath()==sampleLib_.GetPath(); }; Path* ImportSampleDialog::getImportElement() { diff --git a/sources/Application/Views/ModalDialogs/NewProjectDialog.cpp b/sources/Application/Views/ModalDialogs/NewProjectDialog.cpp index 81b0a821..8615fd31 100644 --- a/sources/Application/Views/ModalDialogs/NewProjectDialog.cpp +++ b/sources/Application/Views/ModalDialogs/NewProjectDialog.cpp @@ -83,7 +83,7 @@ void NewProjectDialog::ProcessButtonMask(unsigned short mask,bool pressed) { isDirty_=true ; break ; case 1: - strncpy(name_, " \0", MAX_NAME_LENGTH); + std::fill(name_ + randomName.length(), name_ + sizeof(name_) / sizeof(name_[0]), ' '); strncpy(name_, randomName.c_str(), randomName.length()); lastChar_ = currentChar_ = randomName.length() - 1; isDirty_ = true; diff --git a/sources/Application/Views/PhraseView.cpp b/sources/Application/Views/PhraseView.cpp index 53ecc94c..c8a83d5f 100644 --- a/sources/Application/Views/PhraseView.cpp +++ b/sources/Application/Views/PhraseView.cpp @@ -977,11 +977,11 @@ void PhraseView::DrawView() { // Display row numbers - SetColor(CD_HILITE1) ; char buffer[6] ; pos=anchor ; pos._x-=3 ; for (int j=0;j<16;j++) { + ((j/altRowNumber_)%2)?SetColor(CD_ROW):SetColor(CD_ROW2); hex2char(j,buffer) ; DrawString(pos._x,pos._y,buffer,props) ; pos._y++ ; @@ -1059,7 +1059,7 @@ void PhraseView::DrawView() { setTextProps(props,2,j,true) ; pos._y++ ; if (j == row_ && (col_ == 2 || col_ == 3)) { - printHelpLegend(buffer, props); + printHelpLegend(command, props); } } @@ -1102,7 +1102,7 @@ void PhraseView::DrawView() { setTextProps(props,4,j,true) ; pos._y++ ; if (j == row_ &&(col_ == 4 || col_ == 5)) { - printHelpLegend(buffer, props); + printHelpLegend(command, props); } } @@ -1214,9 +1214,9 @@ void PhraseView::OnPlayerUpdate(PlayerEventType eventType,unsigned int tick) { */ } ; -void PhraseView::printHelpLegend(char *buffer, GUITextProperties props) { - std::string* cmdStr = getHelpLegend(buffer); - DrawString(10, 0, cmdStr[0].c_str(), props); - DrawString(10, 1, cmdStr[1].c_str(), props); - DrawString(10, 2, cmdStr[2].c_str(), props); +void PhraseView::printHelpLegend(FourCC command, GUITextProperties props) { + std::string* cmdStr = getHelpLegend(command); + DrawString(10, 0, cmdStr[0].c_str(), props); + DrawString(10, 1, cmdStr[1].c_str(), props); + DrawString(10, 2, cmdStr[2].c_str(), props); } diff --git a/sources/Application/Views/PhraseView.h b/sources/Application/Views/PhraseView.h index 7e9177d9..7bdc34e7 100644 --- a/sources/Application/Views/PhraseView.h +++ b/sources/Application/Views/PhraseView.h @@ -56,7 +56,7 @@ class PhraseView: public View { int lastPlayingPos_ ; Variable cmdEdit_ ; UIBigHexVarField *cmdEditField_ ; - void printHelpLegend(char* buffer, GUITextProperties props); + void printHelpLegend(FourCC command, GUITextProperties props); struct clipboard { bool active_ ; diff --git a/sources/Application/Views/ProjectView.cpp b/sources/Application/Views/ProjectView.cpp index 2d689e37..a5cc37e4 100644 --- a/sources/Application/Views/ProjectView.cpp +++ b/sources/Application/Views/ProjectView.cpp @@ -25,35 +25,29 @@ static void SaveAsProjectCallback(View &v,ModalView &dialog) { if (dialog.GetReturnCode()>0) { std::string str_dstprjdir; std::string str_dstsmpdir; - #ifdef PLATFORM_PSP - str_dstprjdir = npd.GetName(); - str_dstsmpdir = npd.GetName() + "/samples/"; - #else - std::string up = "../"; - str_dstprjdir = up + npd.GetName(); - str_dstsmpdir = up + npd.GetName() + "/samples/"; - #endif - Path path_dstprjdir = Path(str_dstprjdir); - Path path_dstsmpdir = Path(str_dstsmpdir); + Path root("root:"); + str_dstprjdir = root.GetName() + "/" + npd.GetName(); + str_dstsmpdir = str_dstprjdir + "/samples/"; + Path path_srcprjdir("project:"); Path path_srcsmpdir("project:samples"); + Path path_dstprjdir = Path(str_dstprjdir); + Path path_dstsmpdir = Path(str_dstsmpdir); - Path path_srclgptdatsav = path_srcprjdir.GetPath() + "/lgptsav.dat"; + Path path_srclgptdatsav = path_srcprjdir.GetPath() + "lgptsav.dat"; Path path_dstlgptdatsav = path_dstprjdir.GetPath() + "/lgptsav.dat"; - if (path_dstprjdir.Exists()) { Trace::Log("ProjectView", "Dst Dir '%s' Exist == true", - path_dstprjdir.GetPath().c_str()); } - else { - Result result = FileSystem::GetInstance()->MakeDir(path_dstprjdir.GetPath().c_str()); - if (result.Failed()) { + if (path_dstprjdir.Exists()) { + Trace::Log("ProjectView", "Dst Dir '%s' Exist == true", + path_dstprjdir.GetPath().c_str()); + } else { + if (FileSystem::GetInstance()->MakeDir(path_dstprjdir.GetPath().c_str()).Failed()) { Trace::Log("ProjectView", "Failed to create dir '%s'", path_dstprjdir.GetPath().c_str()); return; }; - result = FileSystem::GetInstance()->MakeDir(path_dstsmpdir.GetPath().c_str()) ; - - if (result.Failed()) { + if (FileSystem::GetInstance()->MakeDir(path_dstsmpdir.GetPath().c_str()).Failed()) { Trace::Log("ProjectView", "Failed to create sample dir '%s'", path_dstprjdir.GetPath().c_str()); return; }; @@ -67,8 +61,7 @@ static void SaveAsProjectCallback(View &v,ModalView &dialog) { IteratorPtrit(idir_srcsmpdir->GetIterator()); for (it->Begin();!it->IsDone();it->Next()) { Path ¤t=it->CurrentItem(); - if (current.IsFile()) - { + if (current.IsFile()) { Path dstfile = Path((str_dstsmpdir+current.GetName()).c_str()); Path srcfile = Path(current.GetPath()); FSS.Copy(srcfile.GetPath(),dstfile.GetPath()); diff --git a/sources/Application/Views/SongView.cpp b/sources/Application/Views/SongView.cpp index f1d0eca5..213e0d46 100644 --- a/sources/Application/Views/SongView.cpp +++ b/sources/Application/Views/SongView.cpp @@ -788,12 +788,12 @@ void SongView::DrawView() { // Display row numbers - SetColor(CD_HILITE1) ; char row[3] ; pos=anchor ; pos._x-=3; for (int j=0;jsongOffset_ ; + ((p/altRowNumber_)%2)?SetColor(CD_ROW):SetColor(CD_ROW2); hex2char(p,row) ; DrawString(pos._x,pos._y,row,props) ; pos._y+=1 ; @@ -828,18 +828,30 @@ void SongView::DrawView() { invert=true ; } } - - if (invert) { - SetColor(CD_HILITE2) ; - props.invert_=true ; - } // draw current step unsigned char d=*data++ ; + + if (d==0xFE) { + SetColor(CD_SONGVIEWFE) ; + } + else if (d==0x00) { + SetColor(CD_SONGVIEW00) ; + } + else{ + SetColor(CD_NORMAL) ; + } + + if (invert) { + SetColor(CD_HILITE2) ; + props.invert_=true ; + } + if (d==0xFF) { DrawString(pos._x,pos._y,"--",props) ; - } else { + } + else { hex2char(d,row) ; DrawString(pos._x,pos._y,row,props) ; } diff --git a/sources/Application/Views/TableView.cpp b/sources/Application/Views/TableView.cpp index 71799c1d..6918da62 100644 --- a/sources/Application/Views/TableView.cpp +++ b/sources/Application/Views/TableView.cpp @@ -684,11 +684,11 @@ void TableView::DrawView() { // Display row numbers - SetColor(CD_HILITE1) ; char buffer[6] ; pos=anchor ; pos._x-=3 ; for (int j=0;j<16;j++) { + ((j/altRowNumber_)%2)?SetColor(CD_ROW):SetColor(CD_ROW2); hex2char(j,buffer) ; DrawString(pos._x,pos._y,buffer,props) ; pos._y++ ; @@ -712,7 +712,7 @@ void TableView::DrawView() { setTextProps(props,0,j,true) ; pos._y++ ; if (j==row_ && (col_ == 0 || col_ == 1)) { - printHelpLegend(buffer, props); + printHelpLegend(command, props); } } @@ -751,7 +751,7 @@ void TableView::DrawView() { setTextProps(props,2,j,true) ; pos._y++ ; if (j==row_ && (col_ == 2 || col_ == 3)) { - printHelpLegend(buffer, props); + printHelpLegend(command, props); } } @@ -789,7 +789,7 @@ void TableView::DrawView() { setTextProps(props,4,j,true) ; pos._y++ ; if (j==row_ && (col_ == 4 || col_ == 5)) { - printHelpLegend(buffer, props); + printHelpLegend(command, props); } } @@ -878,9 +878,9 @@ void TableView::OnPlayerUpdate(PlayerEventType eventType,unsigned int tick) { drawNotes() ; } -void TableView::printHelpLegend(char *buffer, GUITextProperties props) { - std::string* cmdStr = getHelpLegend(buffer); - DrawString(10, 0, cmdStr[0].c_str(), props); - DrawString(10, 1, cmdStr[1].c_str(), props); - DrawString(10, 2, cmdStr[2].c_str(), props); +void TableView::printHelpLegend(FourCC command, GUITextProperties props) { + std::string* cmdStr = getHelpLegend(command); + DrawString(10, 0, cmdStr[0].c_str(), props); + DrawString(10, 1, cmdStr[1].c_str(), props); + DrawString(10, 2, cmdStr[2].c_str(), props); } diff --git a/sources/Application/Views/TableView.h b/sources/Application/Views/TableView.h index 002f8c81..faa84c47 100644 --- a/sources/Application/Views/TableView.h +++ b/sources/Application/Views/TableView.h @@ -47,7 +47,7 @@ class TableView: public View { Variable cmdEdit_ ; UIBigHexVarField *cmdEditField_ ; - void printHelpLegend(char *buffer, GUITextProperties props); + void printHelpLegend(FourCC command, GUITextProperties props); struct clipboard { bool active_ ;