diff --git a/demos/gameboy/freedom.fur b/demos/gameboy/freedom.fur new file mode 100644 index 000000000..024bafded Binary files /dev/null and b/demos/gameboy/freedom.fur differ diff --git a/demos/gameboy/minos.fur b/demos/gameboy/minos.fur new file mode 100644 index 000000000..14cb6244d Binary files /dev/null and b/demos/gameboy/minos.fur differ diff --git a/demos/gameboy/spreadtro.fur b/demos/gameboy/spreadtro.fur new file mode 100644 index 000000000..f8804b394 Binary files /dev/null and b/demos/gameboy/spreadtro.fur differ diff --git a/demos/multichip/track8_n163_k053260.fur b/demos/multichip/track8_n163_k053260.fur new file mode 100644 index 000000000..d5bc373ae Binary files /dev/null and b/demos/multichip/track8_n163_k053260.fur differ diff --git a/doc/2-interface/settings.md b/doc/2-interface/settings.md index 32c85242b..dfb5121a6 100644 --- a/doc/2-interface/settings.md +++ b/doc/2-interface/settings.md @@ -11,21 +11,19 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Render backend** - changing this may help with performace issues. - **Late render clear** -- **Power-saving mode** - - saves power by lowering the frame rate to 2fps when idle. +- **Power-saving mode**: saves power by lowering the frame rate to 2fps when idle. - may cause issues under Mesa drivers! -- **Disable threaded input (restart after changing!)** - - threaded input processes key presses for note preview on a separate thread (on supported platforms), which reduces latency. +- **Disable threaded input (restart after changing!)**: processes key presses for note preview on a separate thread (on supported platforms), which reduces latency. - however, crashes have been reported when threaded input is on. enable this option if that is the case. - **Enable event delay** - may cause issues with high-polling-rate mice when previewing notes. ### File -- **Use system file picker**: use native OS file dialog instead of Furnace's. -- **Number of recent files** +- **Use system file picker**: uses native OS file dialog instead of Furnace's. +- **Number of recent files**: number of files to show in the _open recent..._ menu. - **Compress when saving** - - use zlib to compress saved songs. + - uses zlib to compress saved songs. - **Save unused patterns** - **Use new pattern format when saving** - **Don't apply compatibility flags when loading .dmf** @@ -39,11 +37,11 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Initial system**: the system of chips loaded on starting Furnace. - **Current system**: sets current chips as default. - - **Randomize**: set default to a random system. + - **Randomize**: sets default to a random system. - this will not choose a random system at each start. - **Reset to defaults**: sets default to "Sega Genesis/Mega Drive". - **Name**: name for the default system. may be set to any text. - - system configuration: same as in the [chip manager](../8-advanced/chip-manager.md) and [mixer](../8-advanced/mixer.md). + - **Configure:**: same as in the [chip manager](../8-advanced/chip-manager.md) and [mixer](../8-advanced/mixer.md). - **When creating new song**: - **Display system preset selector** - **Start with initial system** @@ -70,12 +68,12 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. ### Output -- **Backend**: select SDL or JACK for audio output. +- **Backend**: selects SDL or JACK for audio output. - only appears on Linux, or MacOS compiled with JACK support - **Driver** - **Device**: audio device for playback. - **Sample rate** -- **Outputs**: select number of audio outputs created, up to 16. +- **Outputs**: number of audio outputs created, up to 16. - only appears when Backend is JACK. - **Channels**: number of output channels to use. - **Buffer size**: size of buffer in both samples and milliseconds. @@ -209,8 +207,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Export**: writes current layout to a .ini file. - **Reset**: resets layout to default. - **Allow docking editors** -- **Remember window position** - - remembers the window's last position on start-up. +- **Remember window position**: remembers the window's last position on start-up. - **Only allow window movement when clicking on title bar** - **Play/edit controls layout:** - **Classic** @@ -236,7 +233,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **No** - **Yes** - **Yes (while holding Ctrl only)** -- **Toggle channel solo on:** select which interactions with a channel header will toggle solo for that channel. +- **Toggle channel solo on:** selects which interactions with a channel header will toggle solo for that channel. - Right-click or double click - Right-click - Double-click @@ -248,13 +245,15 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Pull delete affects entire channel row** - **Push value when overwriting instead of clearing it**: in the order list and pattern editors, typing into an already-filled value will shift digits instead of starting fresh. - if off: moving the cursor onto the value `A5` and typing a "B" results in `0B`. - - if on: with the cursor on the value `A5` and typing a "B" results in `5B`. + - if on: moving the cursor onto the value `A5` and typing a "B" results in `5B`. - **Effect input behavior:** - **Move down** - **Move to effect value (otherwise move down)** - **Move to effect value/next effect and wrap around** - **Delete effect value when deleting effect** - **Change current instrument when changing instrument column (absorb)** +- **Remove instrument value when inserting note off/release** +- **Remove volume value when inserting note off/release** ### Cursor movement @@ -293,16 +292,17 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. ### Scaling -- **Automatic UI scaling factor**: automatically match the OS's UI scaling. -- **UI scaling factor**: only if "Automatic UI scaling factor" is off. +- **Automatic UI scaling factor**: automatically matches the OS's UI scaling. +- **UI scaling factor**: only appears if "Automatic UI scaling factor" is off. - **Icon size** ### Text -- **Main font**: if "Custom...", a file path selector will appear beneath. -- **Size** -- **Pattern font**: if "Custom...", a file path selector will appear beneath. -- **Size** +- **Main font**: overall interface font.\ + **Header font**: font for section headers.\ + **Pattern font** font for the pattern view, the order list, and related. + - if "Custom...", a file path selector will appear. + - **Size**: font size. - **Display Japanese characters**\ **Display Chinese (Simplified) characters**\ **Display Chinese (Traditional) characters**\ @@ -358,7 +358,7 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. ### Channel -- **Channel style:** +- **Channel style:** sets the appearance of channel headers in pattern view. - **Classic** - **Line** - **Round** @@ -428,11 +428,11 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Between Decay and Sustain Rate** - **After Release Rate** - **Use separate colors for carriers/modulators in FM editor** -- **Unsigned FM detune values** +- **Unsigned FM detune values**: uses the internal representation of detune values, such that detune amounts of -1, -2, and -3 are shown as 5, 6, and 7. ### Statistics -- **Chip memory usage unit:** +- **Chip memory usage unit:** unit for displaying memory usage in the Statistics window. - **Bytes** - **Kilobytes** @@ -440,15 +440,20 @@ settings are saved when clicking the **OK** button at the bottom of the dialog. - **Rounded corners** - **Border** -- **Fill entire window** -- **Waveform goes out of bounds** +- **Mono**: displays a single monaural waveform of all sound mixed together. + - if turned off, waves will be drawn on top of each other for each output channel. + - all colors are configurable via _Settings > Color > Color scheme > Oscilloscope > Wave (non-mono)._ +- **Anti-aliased**: smoothes the lines of the waveform. + - slight performance cost and slightly buggy. +- **Fill entire window**: removes the gap between the waveform and the edge of the window. +- **Waveform goes out of bounds**: allows the waveform to draw past the top and bottom of the oscilloscope. ### Windows - **Rounded window corners** - **Rounded buttons** - **Rounded menu corners** -- **Borders around widgets** +- **Borders around widgets**: draws thin borders on buttons, checkboxes, text widgets, and the like. diff --git a/extern/imgui_patched/imconfig.h b/extern/imgui_patched/imconfig.h index 876cf32f7..860c0b427 100644 --- a/extern/imgui_patched/imconfig.h +++ b/extern/imgui_patched/imconfig.h @@ -97,7 +97,9 @@ // Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). // Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. // Read about ImGuiBackendFlags_RendererHasVtxOffset for details. -//#define ImDrawIdx unsigned int +#ifndef IS_MOBILE +#define ImDrawIdx unsigned int +#endif //---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) //struct ImDrawList; diff --git a/extern/imgui_patched/imconfig_fur.h b/extern/imgui_patched/imconfig_fur.h index 9c62b3966..30ca74732 100644 --- a/extern/imgui_patched/imconfig_fur.h +++ b/extern/imgui_patched/imconfig_fur.h @@ -96,7 +96,9 @@ // Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). // Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. // Read about ImGuiBackendFlags_RendererHasVtxOffset for details. -//#define ImDrawIdx unsigned int +#ifndef IS_MOBILE +#define ImDrawIdx unsigned int +#endif //---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) //struct ImDrawList; diff --git a/extern/nfd-modified/src/nfd_win.cpp b/extern/nfd-modified/src/nfd_win.cpp index 9c12c3485..c60f7a753 100644 --- a/extern/nfd-modified/src/nfd_win.cpp +++ b/extern/nfd-modified/src/nfd_win.cpp @@ -532,6 +532,9 @@ nfdresult_t NFD_OpenDialogMultiple( const std::vector& filterList, nfdselcallback_t selCallback ) { nfdresult_t nfdResult = NFD_ERROR; + NFDWinEvents* winEvents; + bool hasEvents=true; + DWORD eventID=0; HRESULT coResult = COMInit(); @@ -566,6 +569,16 @@ nfdresult_t NFD_OpenDialogMultiple( const std::vector& filterList, goto end; } + // Pass the callback + winEvents=new NFDWinEvents(selCallback); + if ( !SUCCEEDED(fileOpenDialog->Advise(winEvents,&eventID)) ) { + // error... ignore + hasEvents=false; + winEvents->Release(); + } else { + winEvents->Release(); + } + // Set a flag for multiple options DWORD dwFlags; result = fileOpenDialog->GetOptions(&dwFlags); @@ -613,8 +626,12 @@ nfdresult_t NFD_OpenDialogMultiple( const std::vector& filterList, } end: - if ( fileOpenDialog ) + if (fileOpenDialog) { + if (hasEvents) { + fileOpenDialog->Unadvise(eventID); + } fileOpenDialog->Release(); + } COMUninit(coResult); diff --git a/res/icons.sfd b/res/icons.sfd new file mode 100644 index 000000000..aa8c80728 --- /dev/null +++ b/res/icons.sfd @@ -0,0 +1,1306 @@ +SplineFontDB: 3.2 +FontName: FurnaceIcons +FullName: Furnace Icons +FamilyName: Furnace Icons +Weight: Regular +Copyright: +UComments: "2023-8-8: Created with FontForge (http://fontforge.org)" +Version: 001.000 +ItalicAngle: 0 +UnderlinePosition: 0 +UnderlineWidth: 0 +Ascent: 1536 +Descent: 256 +InvalidEm: 0 +LayerCount: 2 +Layer: 0 0 "Back" 1 +Layer: 1 0 "Fore" 0 +XUID: [1021 230 235539655 3711] +FSType: 0 +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 0 +CreationTime: 1691524879 +ModificationTime: 1691614885 +PfmFamily: 81 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 0 +VLineGap: 0 +OS2TypoAscent: 1536 +OS2TypoAOffset: 0 +OS2TypoDescent: -256 +OS2TypoDOffset: 0 +OS2TypoLinegap: 0 +OS2WinAscent: 1536 +OS2WinAOffset: 0 +OS2WinDescent: 256 +OS2WinDOffset: 0 +HheadAscent: 1536 +HheadAOffset: 0 +HheadDescent: -256 +HheadDOffset: 0 +OS2Vendor: 'FurT' +MarkAttachClasses: 1 +DEI: 91125 +LangName: 1033 +Encoding: UnicodeBmp +UnicodeInterp: none +NameList: AGL For New Fonts +DisplaySize: -48 +AntiAlias: 1 +FitToEm: 0 +WinInfo: 61400 8 11 +BeginPrivate: 0 +EndPrivate +TeXData: 1 0 0 346030 173015 115343 0 1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 +BeginChars: 65536 11 + +StartChar: uniEFF6 +Encoding: 61430 61430 0 +Width: 1792 +Flags: HW +HStem: -87.5 97.6641<15.6582 26.9082 329.322 340.572 735.658 746.908 1049.32 1060.57 1455.66 1466.91 1769.32 1780.57> 423.109 92.4609<171.189 181.596 891.189 901.596 1611.19 1621.6> 735.5 97.6641<15.6582 26.9082 329.322 340.572 735.658 746.908 1049.32 1060.57 1455.66 1466.91 1769.32 1780.57> 1246.11 92.4609<171.189 181.596 891.189 901.596 1611.19 1621.6> +VStem: -167.506 93.3047<422.266 515.57 1245.27 1338.57> 121.971 111.445<455.694 515.57 1278.69 1338.57> 278.346 109.758<-87.5 -30.2713 735.5 792.729> 430.432 89.8594<425.711 515.57 1248.71 1338.57> 552.494 93.3047<422.266 515.57 1245.27 1338.57> 841.971 111.445<455.694 515.57 1278.69 1338.57> 998.346 109.758<-87.5 -30.2713 735.5 792.729> 1150.43 89.8594<425.711 515.57 1248.71 1338.57> 1272.49 93.3047<422.266 515.57 1245.27 1338.57> 1561.97 111.445<455.694 515.57 1278.69 1338.57> 1718.35 109.758<-87.5 -30.2713 735.5 792.729> 1870.43 89.8594<425.711 515.57 1248.71 1338.57> +DStem2: -74.2012 1338.57 -167.506 1338.57 0.207465 -0.978243<0 372.236> -74.2012 515.57 -167.506 515.57 0.207465 -0.978243<0 372.236> 26.9082 833.164 152.205 1107.03 0.135247 0.990812<0 428.665> 26.9082 10.1641 152.205 284.031 0.135247 0.990812<0 428.665> 310.338 971.398 200.58 1107.03 0.204871 -0.978789<-295.26 139.192> 310.338 148.398 200.58 284.031 0.204871 -0.978789<-295.26 139.192> 645.799 1338.57 552.494 1338.57 0.207465 -0.978243<0 372.236> 645.799 515.57 552.494 515.57 0.207465 -0.978243<0 372.236> 746.908 833.164 872.205 1107.03 0.135247 0.990812<0 428.665> 746.908 10.1641 872.205 284.031 0.135247 0.990812<0 428.665> 1030.34 971.398 920.58 1107.03 0.204871 -0.978789<-295.26 139.192> 1030.34 148.398 920.58 284.031 0.204871 -0.978789<-295.26 139.192> 1365.8 1338.57 1272.49 1338.57 0.207465 -0.978243<0 372.236> 1365.8 515.57 1272.49 515.57 0.207465 -0.978243<0 372.236> 1466.91 833.164 1592.21 1107.03 0.135247 0.990812<0 428.665> 1466.91 10.1641 1592.21 284.031 0.135247 0.990812<0 428.665> 1750.34 971.398 1640.58 1107.03 0.204871 -0.978789<-295.26 139.192> 1750.34 148.398 1640.58 284.031 0.204871 -0.978789<-295.26 139.192> +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +-39.607421875 735.5 m 1 + -167.505859375 1338.5703125 l 1 + -74.201171875 1338.5703125 l 1 + -3.326171875 973.0859375 l 1 + 15.658203125 833.1640625 l 1 + 26.908203125 833.1640625 l 1 + 45.892578125 971.3984375 l 1 + 121.970703125 1338.5703125 l 1 + 233.416015625 1338.5703125 l 1 + 310.337890625 971.3984375 l 1 + 329.322265625 833.1640625 l 1 + 340.572265625 833.1640625 l 1 + 359.556640625 973.0859375 l 1 + 430.431640625 1338.5703125 l 1 + 520.291015625 1338.5703125 l 1 + 388.103515625 735.5 l 1 + 278.345703125 735.5 l 1 + 200.580078125 1107.03125 l 1 + 181.595703125 1246.109375 l 1 + 171.189453125 1246.109375 l 1 + 152.205078125 1107.03125 l 1 + 70.994140625 735.5 l 1 + -39.607421875 735.5 l 1 +680.392578125 735.5 m 1 + 552.494140625 1338.5703125 l 1 + 645.798828125 1338.5703125 l 1 + 716.673828125 973.0859375 l 1 + 735.658203125 833.1640625 l 1 + 746.908203125 833.1640625 l 1 + 765.892578125 971.3984375 l 1 + 841.970703125 1338.5703125 l 1 + 953.416015625 1338.5703125 l 1 + 1030.33789062 971.3984375 l 1 + 1049.32226562 833.1640625 l 1 + 1060.57226562 833.1640625 l 1 + 1079.55664062 973.0859375 l 1 + 1150.43164062 1338.5703125 l 1 + 1240.29101562 1338.5703125 l 1 + 1108.10351562 735.5 l 1 + 998.345703125 735.5 l 1 + 920.580078125 1107.03125 l 1 + 901.595703125 1246.109375 l 1 + 891.189453125 1246.109375 l 1 + 872.205078125 1107.03125 l 1 + 790.994140625 735.5 l 1 + 680.392578125 735.5 l 1 +1400.39257812 735.5 m 1 + 1272.49414062 1338.5703125 l 1 + 1365.79882812 1338.5703125 l 1 + 1436.67382812 973.0859375 l 1 + 1455.65820312 833.1640625 l 1 + 1466.90820312 833.1640625 l 1 + 1485.89257812 971.3984375 l 1 + 1561.97070312 1338.5703125 l 1 + 1673.41601562 1338.5703125 l 1 + 1750.33789062 971.3984375 l 1 + 1769.32226562 833.1640625 l 1 + 1780.57226562 833.1640625 l 1 + 1799.55664062 973.0859375 l 1 + 1870.43164062 1338.5703125 l 1 + 1960.29101562 1338.5703125 l 1 + 1828.10351562 735.5 l 1 + 1718.34570312 735.5 l 1 + 1640.58007812 1107.03125 l 1 + 1621.59570312 1246.109375 l 1 + 1611.18945312 1246.109375 l 1 + 1592.20507812 1107.03125 l 1 + 1510.99414062 735.5 l 1 + 1400.39257812 735.5 l 1 +-39.607421875 -87.5 m 5 + -167.505859375 515.5703125 l 5 + -74.201171875 515.5703125 l 5 + -3.326171875 150.0859375 l 5 + 15.658203125 10.1640625 l 5 + 26.908203125 10.1640625 l 5 + 45.892578125 148.3984375 l 5 + 121.970703125 515.5703125 l 5 + 233.416015625 515.5703125 l 5 + 310.337890625 148.3984375 l 5 + 329.322265625 10.1640625 l 5 + 340.572265625 10.1640625 l 5 + 359.556640625 150.0859375 l 5 + 430.431640625 515.5703125 l 5 + 520.291015625 515.5703125 l 5 + 388.103515625 -87.5 l 5 + 278.345703125 -87.5 l 5 + 200.580078125 284.03125 l 5 + 181.595703125 423.109375 l 5 + 171.189453125 423.109375 l 5 + 152.205078125 284.03125 l 5 + 70.994140625 -87.5 l 5 + -39.607421875 -87.5 l 5 +680.392578125 -87.5 m 5 + 552.494140625 515.5703125 l 5 + 645.798828125 515.5703125 l 5 + 716.673828125 150.0859375 l 5 + 735.658203125 10.1640625 l 5 + 746.908203125 10.1640625 l 5 + 765.892578125 148.3984375 l 5 + 841.970703125 515.5703125 l 5 + 953.416015625 515.5703125 l 5 + 1030.33789062 148.3984375 l 5 + 1049.32226562 10.1640625 l 5 + 1060.57226562 10.1640625 l 5 + 1079.55664062 150.0859375 l 5 + 1150.43164062 515.5703125 l 5 + 1240.29101562 515.5703125 l 5 + 1108.10351562 -87.5 l 5 + 998.345703125 -87.5 l 5 + 920.580078125 284.03125 l 5 + 901.595703125 423.109375 l 5 + 891.189453125 423.109375 l 5 + 872.205078125 284.03125 l 5 + 790.994140625 -87.5 l 5 + 680.392578125 -87.5 l 5 +1400.39257812 -87.5 m 5 + 1272.49414062 515.5703125 l 5 + 1365.79882812 515.5703125 l 5 + 1436.67382812 150.0859375 l 5 + 1455.65820312 10.1640625 l 5 + 1466.90820312 10.1640625 l 5 + 1485.89257812 148.3984375 l 5 + 1561.97070312 515.5703125 l 5 + 1673.41601562 515.5703125 l 5 + 1750.33789062 148.3984375 l 5 + 1769.32226562 10.1640625 l 5 + 1780.57226562 10.1640625 l 5 + 1799.55664062 150.0859375 l 5 + 1870.43164062 515.5703125 l 5 + 1960.29101562 515.5703125 l 5 + 1828.10351562 -87.5 l 5 + 1718.34570312 -87.5 l 5 + 1640.58007812 284.03125 l 5 + 1621.59570312 423.109375 l 5 + 1611.18945312 423.109375 l 5 + 1592.20507812 284.03125 l 5 + 1510.99414062 -87.5 l 5 + 1400.39257812 -87.5 l 5 +EndSplineSet +EndChar + +StartChar: uniEFF3 +Encoding: 61427 61427 1 +Width: 1792 +Flags: HW +HStem: 323.95 97.6641<15.6582 26.9082 329.322 340.572 735.658 746.908 1049.32 1060.57 1455.66 1466.91 1769.32 1780.57> 834.56 92.4609<171.189 181.596 891.189 901.596 1611.19 1621.6> +VStem: -167.506 93.3047<833.716 927.021> 121.971 111.445<867.144 927.021> 278.346 109.758<323.95 381.179> 430.432 89.8594<837.161 927.021> 552.494 93.3047<833.716 927.021> 841.971 111.445<867.144 927.021> 998.346 109.758<323.95 381.179> 1150.43 89.8594<837.161 927.021> 1272.49 93.3047<833.716 927.021> 1561.97 111.445<867.144 927.021> 1718.35 109.758<323.95 381.179> 1870.43 89.8594<837.161 927.021> +DStem2: -74.2012 927.021 -167.506 927.021 0.207465 -0.978243<0 372.236> 26.9082 421.614 152.205 695.481 0.135247 0.990812<0 428.665> 310.338 559.849 200.58 695.481 0.204871 -0.978789<-295.26 139.192> 645.799 927.021 552.494 927.021 0.207465 -0.978243<0 372.236> 746.908 421.614 872.205 695.481 0.135247 0.990812<0 428.665> 1030.34 559.849 920.58 695.481 0.204871 -0.978789<-295.26 139.192> 1365.8 927.021 1272.49 927.021 0.207465 -0.978243<0 372.236> 1466.91 421.614 1592.21 695.481 0.135247 0.990812<0 428.665> 1750.34 559.849 1640.58 695.481 0.204871 -0.978789<-295.26 139.192> +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +-39.607421875 323.950195312 m 1 + -167.505859375 927.020507812 l 1 + -74.201171875 927.020507812 l 1 + -3.326171875 561.536132812 l 1 + 15.658203125 421.614257812 l 1 + 26.908203125 421.614257812 l 1 + 45.892578125 559.848632812 l 1 + 121.970703125 927.020507812 l 1 + 233.416015625 927.020507812 l 1 + 310.337890625 559.848632812 l 1 + 329.322265625 421.614257812 l 1 + 340.572265625 421.614257812 l 1 + 359.556640625 561.536132812 l 1 + 430.431640625 927.020507812 l 1 + 520.291015625 927.020507812 l 1 + 388.103515625 323.950195312 l 1 + 278.345703125 323.950195312 l 1 + 200.580078125 695.481445312 l 1 + 181.595703125 834.559570312 l 1 + 171.189453125 834.559570312 l 1 + 152.205078125 695.481445312 l 1 + 70.994140625 323.950195312 l 1 + -39.607421875 323.950195312 l 1 +680.392578125 323.950195312 m 1 + 552.494140625 927.020507812 l 1 + 645.798828125 927.020507812 l 1 + 716.673828125 561.536132812 l 1 + 735.658203125 421.614257812 l 1 + 746.908203125 421.614257812 l 1 + 765.892578125 559.848632812 l 1 + 841.970703125 927.020507812 l 1 + 953.416015625 927.020507812 l 1 + 1030.33789062 559.848632812 l 1 + 1049.32226562 421.614257812 l 1 + 1060.57226562 421.614257812 l 1 + 1079.55664062 561.536132812 l 1 + 1150.43164062 927.020507812 l 1 + 1240.29101562 927.020507812 l 1 + 1108.10351562 323.950195312 l 1 + 998.345703125 323.950195312 l 1 + 920.580078125 695.481445312 l 1 + 901.595703125 834.559570312 l 1 + 891.189453125 834.559570312 l 1 + 872.205078125 695.481445312 l 1 + 790.994140625 323.950195312 l 1 + 680.392578125 323.950195312 l 1 +1400.39257812 323.950195312 m 1 + 1272.49414062 927.020507812 l 1 + 1365.79882812 927.020507812 l 1 + 1436.67382812 561.536132812 l 1 + 1455.65820312 421.614257812 l 1 + 1466.90820312 421.614257812 l 1 + 1485.89257812 559.848632812 l 1 + 1561.97070312 927.020507812 l 1 + 1673.41601562 927.020507812 l 1 + 1750.33789062 559.848632812 l 1 + 1769.32226562 421.614257812 l 1 + 1780.57226562 421.614257812 l 1 + 1799.55664062 561.536132812 l 1 + 1870.43164062 927.020507812 l 1 + 1960.29101562 927.020507812 l 1 + 1828.10351562 323.950195312 l 1 + 1718.34570312 323.950195312 l 1 + 1640.58007812 695.481445312 l 1 + 1621.59570312 834.559570312 l 1 + 1611.18945312 834.559570312 l 1 + 1592.20507812 695.481445312 l 1 + 1510.99414062 323.950195312 l 1 + 1400.39257812 323.950195312 l 1 +EndSplineSet +EndChar + +StartChar: uniEFF2 +Encoding: 61426 61426 2 +Width: 1792 +Flags: HW +HStem: 290.5 108.516<317.609 330.109 666.125 678.625 1117.61 1130.11 1466.12 1478.62> +VStem: 114.094 103.672<856.906 960.578> 435.734 123.828<900.702 960.578> 609.484 121.953<290.5 347.729> 778.469 99.8438<860.734 960.578> 914.094 103.672<856.906 960.578> 1235.73 123.828<900.702 960.578> 1409.48 121.953<290.5 347.729> 1578.47 99.8438<860.734 960.578> +DStem2: 217.766 960.578 114.094 960.578 0.207465 -0.978243<0 413.596> 330.109 399.016 469.328 703.312 0.135247 0.990812<28.0512 476.294> 645.031 552.609 523.078 703.312 0.204871 -0.978789<-328.066 154.657> 1017.77 960.578 914.094 960.578 0.207465 -0.978243<0 413.596> 1130.11 399.016 1269.33 703.312 0.135247 0.990812<28.0512 476.294> 1445.03 552.609 1323.08 703.312 0.204871 -0.978789<-328.066 154.657> +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +256.203125 290.5 m 1 + 114.09375 960.578125 l 1 + 217.765625 960.578125 l 1 + 296.515625 554.484375 l 1 + 317.609375 399.015625 l 1 + 330.109375 399.015625 l 1 + 351.203125 552.609375 l 1 + 435.734375 960.578125 l 1 + 559.5625 960.578125 l 1 + 645.03125 552.609375 l 1 + 666.125 399.015625 l 1 + 678.625 399.015625 l 1 + 699.71875 554.484375 l 1 + 778.46875 960.578125 l 1 + 878.3125 960.578125 l 1 + 731.4375 290.5 l 1 + 609.484375 290.5 l 1 + 523.078125 703.3125 l 1 + 501.984375 857.84375 l 1 + 490.421875 857.84375 l 1 + 469.328125 703.3125 l 1 + 379.09375 290.5 l 1 + 256.203125 290.5 l 1 +1056.203125 290.5 m 1 + 914.09375 960.578125 l 1 + 1017.765625 960.578125 l 1 + 1096.515625 554.484375 l 1 + 1117.609375 399.015625 l 1 + 1130.109375 399.015625 l 1 + 1151.203125 552.609375 l 1 + 1235.734375 960.578125 l 1 + 1359.5625 960.578125 l 1 + 1445.03125 552.609375 l 1 + 1466.125 399.015625 l 1 + 1478.625 399.015625 l 1 + 1499.71875 554.484375 l 1 + 1578.46875 960.578125 l 1 + 1678.3125 960.578125 l 1 + 1531.4375 290.5 l 1 + 1409.484375 290.5 l 1 + 1323.078125 703.3125 l 1 + 1301.984375 857.84375 l 1 + 1290.421875 857.84375 l 1 + 1269.328125 703.3125 l 1 + 1179.09375 290.5 l 1 + 1056.203125 290.5 l 1 +EndSplineSet +EndChar + +StartChar: uniEFF5 +Encoding: 61429 61429 3 +Width: 1792 +Flags: HW +HStem: -142.5 108.516<317.609 330.109 666.125 678.625 1117.61 1130.11 1466.12 1478.62> 723.5 108.516<317.609 330.109 666.125 678.625 1117.61 1130.11 1466.12 1478.62> +VStem: 114.094 103.672<423.906 527.578 1289.91 1393.58> 435.734 123.828<467.702 527.578 1333.7 1393.58> 609.484 121.953<-142.5 -85.2713 723.5 780.729> 778.469 99.8438<427.734 527.578 1293.73 1393.58> 914.094 103.672<423.906 527.578 1289.91 1393.58> 1235.73 123.828<467.702 527.578 1333.7 1393.58> 1409.48 121.953<-142.5 -85.2713 723.5 780.729> 1578.47 99.8438<427.734 527.578 1293.73 1393.58> +DStem2: 217.766 1393.58 114.094 1393.58 0.207465 -0.978243<0 413.596> 217.766 527.578 114.094 527.578 0.207465 -0.978243<0 413.596> 330.109 832.016 469.328 1136.31 0.135247 0.990812<28.0512 476.294> 330.109 -33.9844 469.328 270.312 0.135247 0.990812<28.0512 476.294> 645.031 985.609 523.078 1136.31 0.204871 -0.978789<-328.066 154.657> 645.031 119.609 523.078 270.312 0.204871 -0.978789<-328.066 154.657> 1017.77 1393.58 914.094 1393.58 0.207465 -0.978243<0 413.596> 1017.77 527.578 914.094 527.578 0.207465 -0.978243<0 413.596> 1130.11 832.016 1269.33 1136.31 0.135247 0.990812<28.0512 476.294> 1130.11 -33.9844 1269.33 270.312 0.135247 0.990812<28.0512 476.294> 1445.03 985.609 1323.08 1136.31 0.204871 -0.978789<-328.066 154.657> 1445.03 119.609 1323.08 270.312 0.204871 -0.978789<-328.066 154.657> +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +256.203125 -142.5 m 1 + 114.09375 527.578125 l 1 + 217.765625 527.578125 l 1 + 296.515625 121.484375 l 1 + 317.609375 -33.984375 l 1 + 330.109375 -33.984375 l 1 + 351.203125 119.609375 l 1 + 435.734375 527.578125 l 1 + 559.5625 527.578125 l 1 + 645.03125 119.609375 l 1 + 666.125 -33.984375 l 1 + 678.625 -33.984375 l 1 + 699.71875 121.484375 l 1 + 778.46875 527.578125 l 1 + 878.3125 527.578125 l 1 + 731.4375 -142.5 l 1 + 609.484375 -142.5 l 1 + 523.078125 270.3125 l 1 + 501.984375 424.84375 l 1 + 490.421875 424.84375 l 1 + 469.328125 270.3125 l 1 + 379.09375 -142.5 l 1 + 256.203125 -142.5 l 1 +1056.203125 -142.5 m 1 + 914.09375 527.578125 l 1 + 1017.765625 527.578125 l 1 + 1096.515625 121.484375 l 1 + 1117.609375 -33.984375 l 1 + 1130.109375 -33.984375 l 1 + 1151.203125 119.609375 l 1 + 1235.734375 527.578125 l 1 + 1359.5625 527.578125 l 1 + 1445.03125 119.609375 l 1 + 1466.125 -33.984375 l 1 + 1478.625 -33.984375 l 1 + 1499.71875 121.484375 l 1 + 1578.46875 527.578125 l 1 + 1678.3125 527.578125 l 1 + 1531.4375 -142.5 l 1 + 1409.484375 -142.5 l 1 + 1323.078125 270.3125 l 1 + 1301.984375 424.84375 l 1 + 1290.421875 424.84375 l 1 + 1269.328125 270.3125 l 1 + 1179.09375 -142.5 l 1 + 1056.203125 -142.5 l 1 +256.203125 723.5 m 1 + 114.09375 1393.578125 l 1 + 217.765625 1393.578125 l 1 + 296.515625 987.484375 l 1 + 317.609375 832.015625 l 1 + 330.109375 832.015625 l 1 + 351.203125 985.609375 l 1 + 435.734375 1393.578125 l 1 + 559.5625 1393.578125 l 1 + 645.03125 985.609375 l 1 + 666.125 832.015625 l 1 + 678.625 832.015625 l 1 + 699.71875 987.484375 l 1 + 778.46875 1393.578125 l 1 + 878.3125 1393.578125 l 1 + 731.4375 723.5 l 1 + 609.484375 723.5 l 1 + 523.078125 1136.3125 l 1 + 501.984375 1290.84375 l 1 + 490.421875 1290.84375 l 1 + 469.328125 1136.3125 l 1 + 379.09375 723.5 l 1 + 256.203125 723.5 l 1 +1056.203125 723.5 m 1 + 914.09375 1393.578125 l 1 + 1017.765625 1393.578125 l 1 + 1096.515625 987.484375 l 1 + 1117.609375 832.015625 l 1 + 1130.109375 832.015625 l 1 + 1151.203125 985.609375 l 1 + 1235.734375 1393.578125 l 1 + 1359.5625 1393.578125 l 1 + 1445.03125 985.609375 l 1 + 1466.125 832.015625 l 1 + 1478.625 832.015625 l 1 + 1499.71875 987.484375 l 1 + 1578.46875 1393.578125 l 1 + 1678.3125 1393.578125 l 1 + 1531.4375 723.5 l 1 + 1409.484375 723.5 l 1 + 1323.078125 1136.3125 l 1 + 1301.984375 1290.84375 l 1 + 1290.421875 1290.84375 l 1 + 1269.328125 1136.3125 l 1 + 1179.09375 723.5 l 1 + 1056.203125 723.5 l 1 +EndSplineSet +EndChar + +StartChar: uniEFF1 +Encoding: 61425 61425 4 +Width: 1792 +Flags: H +VStem: 232.799 173.865<979.508 1153.37> 1392.52 167.836<985.537 1153.37> +DStem2: 406.664 1153.37 232.799 1153.37 0.229994 -0.973192<0 877.585> 592.588 294.506 674.291 98 0.24367 0.969858<0 722.624> 993.352 1153.37 895.037 964.373 0.238997 -0.97102<160.026 881.918> 1204.99 296.105 1300.23 98 0.239311 0.970943<0 877.234> +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +482.21484375 98 m 1 + 232.798828125 1153.37304688 l 1 + 406.6640625 1153.37304688 l 1 + 513.9609375 645.3125 l 1 + 588.158203125 294.505859375 l 1 + 592.587890625 294.505859375 l 1 + 677.3671875 645.3125 l 1 + 802.751953125 1153.37304688 l 1 + 993.3515625 1153.37304688 l 1 + 1117.25976562 645.3125 l 1 + 1200.43945312 296.10546875 l 1 + 1204.9921875 296.10546875 l 1 + 1282.14257812 645.3125 l 1 + 1392.515625 1153.37304688 l 1 + 1560.3515625 1153.37304688 l 1 + 1300.23046875 98 l 1 + 1108.27734375 98 l 1 + 973.6640625 643.8359375 l 1 + 895.037109375 964.373046875 l 1 + 891.9609375 964.373046875 l 1 + 811.857421875 643.8359375 l 1 + 674.291015625 98 l 1 + 482.21484375 98 l 1 +EndSplineSet +EndChar + +StartChar: uniF004 +Encoding: 61444 61444 5 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +EndUndoOperation +UndoOperation +Index: 1 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +267.583007812 313.6640625 m 0 + 216.887695312 313.6640625 173.856445312 322.875 138.418945312 341.296875 c 128 + 102.981445312 359.71875 72.6064453125 384.46875 47.2939453125 415.6171875 c 1 + 114.653320312 478.6875 l 1 + 135.958007812 452.7421875 159.442382812 433.125 185.036132812 419.90625 c 128 + 210.700195312 406.6875 239.950195312 400.0078125 272.786132812 400.0078125 c 0 + 311.387695312 400.0078125 340.426757812 408.65625 360.043945312 425.953125 c 128 + 379.590820312 443.25 389.434570312 466.59375 389.434570312 495.9140625 c 0 + 389.434570312 519.5390625 382.473632812 538.2421875 368.692382812 552.09375 c 128 + 354.840820312 565.9453125 330.372070312 576.28125 295.215820312 583.171875 c 2 + 241.637695312 592.734375 l 2 + 182.926757812 603.6328125 138.840820312 622.96875 109.450195312 650.6015625 c 128 + 80.0595703125 678.234375 65.4345703125 716.2734375 65.4345703125 764.6484375 c 0 + 65.4345703125 791.15625 70.4267578125 815.203125 80.5517578125 836.7890625 c 128 + 90.6064453125 858.375 104.739257812 876.515625 122.879882812 891.2109375 c 128 + 141.020507812 905.90625 163.028320312 917.296875 188.973632812 925.3125 c 128 + 214.848632812 933.3984375 243.958007812 937.40625 276.231445312 937.40625 c 0 + 321.723632812 937.40625 361.168945312 929.53125 394.567382812 913.7109375 c 128 + 427.965820312 897.8203125 456.512695312 874.96875 480.137695312 845.015625 c 1 + 411.864257812 784.546875 l 1 + 396.325195312 804.65625 377.340820312 820.828125 354.840820312 832.921875 c 128 + 332.411132812 845.015625 304.426757812 851.0625 271.028320312 851.0625 c 0 + 236.504882812 851.0625 209.715820312 844.1015625 190.661132812 830.3203125 c 128 + 171.676757812 816.46875 162.184570312 796.2890625 162.184570312 769.8515625 c 0 + 162.184570312 744.46875 169.918945312 725.625 185.528320312 713.25 c 128 + 201.067382812 700.875 225.254882812 691.453125 258.090820312 685.125 c 2 + 311.668945312 673.9453125 l 2 + 372.137695312 662.4140625 416.364257812 642.796875 444.278320312 615.1640625 c 128 + 472.192382812 587.53125 486.184570312 549.4921875 486.184570312 501.1171875 c 0 + 486.184570312 472.921875 481.262695312 447.2578125 471.489257812 424.1953125 c 128 + 461.715820312 401.203125 447.442382812 381.4453125 428.739257812 365.0625 c 128 + 409.965820312 348.609375 387.114257812 335.953125 360.043945312 327.0234375 c 128 + 332.973632812 318.09375 302.106445312 313.6640625 267.583007812 313.6640625 c 0 +1052.41113281 785.390625 m 1 + 1048.05175781 785.390625 l 1 + 1000.52050781 687.7265625 l 1 + 868.333007812 446.6953125 l 1 + 736.145507812 687.7265625 l 1 + 688.614257812 785.390625 l 1 + 684.325195312 785.390625 l 1 + 684.325195312 324 l 1 + 591.020507812 324 l 1 + 591.020507812 927.0703125 l 1 + 706.754882812 927.0703125 l 1 + 868.333007812 620.3671875 l 1 + 873.536132812 620.3671875 l 1 + 1035.11425781 927.0703125 l 1 + 1145.71582031 927.0703125 l 1 + 1145.71582031 324 l 1 + 1052.41113281 324 l 1 + 1052.41113281 785.390625 l 1 +1311.02050781 324 m 1 + 1311.02050781 927.0703125 l 1 + 1570.19238281 927.0703125 l 2 + 1626.09082031 927.0703125 1669.26269531 910.6875 1699.77832031 877.8515625 c 128 + 1730.36425781 845.015625 1745.62207031 800.9296875 1745.62207031 745.6640625 c 256 + 1745.62207031 690.328125 1730.36425781 646.2421875 1699.77832031 613.40625 c 128 + 1669.26269531 580.640625 1626.09082031 564.1875 1570.19238281 564.1875 c 2 + 1408.61425781 564.1875 l 1 + 1408.61425781 324 l 1 + 1311.02050781 324 l 1 +1408.61425781 649.7578125 m 1 + 1564.14550781 649.7578125 l 2 + 1588.89550781 649.7578125 1608.23144531 656.2265625 1622.01269531 669.1640625 c 128 + 1635.86425781 682.1015625 1642.75488281 700.734375 1642.75488281 724.921875 c 2 + 1642.75488281 766.3359375 l 2 + 1642.75488281 790.59375 1635.86425781 809.15625 1622.01269531 822.09375 c 128 + 1608.23144531 835.03125 1588.89550781 841.5703125 1564.14550781 841.5703125 c 2 + 1408.61425781 841.5703125 l 1 + 1408.61425781 649.7578125 l 1 +EndSplineSet +EndChar + +StartChar: uniF01A +Encoding: 61466 61466 6 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +EndUndoOperation +UndoOperation +Index: 1 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +536.239257812 -97.8359375 m 0 + 502.840820312 -97.8359375 473.028320312 -92.421875 446.801757812 -81.453125 c 128 + 420.575195312 -70.484375 398.426757812 -54.8046875 380.286132812 -34.34375 c 128 + 362.145507812 -13.8828125 348.153320312 10.7265625 338.379882812 39.484375 c 128 + 328.606445312 68.3125 323.684570312 100.8671875 323.684570312 137.1484375 c 0 + 323.684570312 180.8828125 330.293945312 222.0859375 343.583007812 260.6875 c 128 + 356.801757812 299.2890625 373.817382812 334.7265625 394.559570312 366.9296875 c 128 + 415.301757812 399.203125 438.434570312 427.890625 464.098632812 452.921875 c 128 + 489.692382812 477.953125 514.934570312 498.8359375 539.684570312 515.5703125 c 1 + 669.270507812 515.5703125 l 1 + 635.309570312 490.8203125 604.793945312 466.9140625 577.723632812 443.8515625 c 128 + 550.653320312 420.7890625 527.028320312 397.234375 506.848632812 373.046875 c 128 + 486.668945312 348.7890625 469.864257812 323.1953125 456.293945312 296.125 c 128 + 442.793945312 269.0546875 432.247070312 239.3828125 424.793945312 207.109375 c 1 + 430.840820312 205.421875 l 1 + 437.168945312 217.515625 444.481445312 228.8359375 452.848632812 239.5234375 c 128 + 461.215820312 250.2109375 470.989257812 259.5625 482.239257812 267.578125 c 128 + 493.489257812 275.6640625 506.286132812 281.9921875 520.700195312 286.6328125 c 128 + 535.114257812 291.203125 551.778320312 293.5234375 570.762695312 293.5234375 c 0 + 596.145507812 293.5234375 619.629882812 289.234375 641.215820312 280.5859375 c 128 + 662.801757812 271.9375 681.504882812 259.421875 697.395507812 242.96875 c 128 + 713.215820312 226.5859375 725.590820312 206.828125 734.520507812 183.765625 c 128 + 743.450195312 160.7734375 747.950195312 135.109375 747.950195312 106.9140625 c 0 + 747.950195312 76.3984375 742.887695312 48.5546875 732.762695312 23.5234375 c 128 + 722.708007812 -1.5078125 708.434570312 -22.953125 690.012695312 -40.8125 c 128 + 671.590820312 -58.671875 649.301757812 -72.6640625 623.075195312 -82.71875 c 128 + 596.848632812 -92.84375 567.950195312 -97.8359375 536.239257812 -97.8359375 c 0 +536.239257812 -18.3828125 m 256 + 571.395507812 -18.3828125 598.747070312 -9.03125 618.293945312 9.671875 c 128 + 637.911132812 28.4453125 647.684570312 55.9375 647.684570312 92.21875 c 2 + 647.684570312 104.3125 l 2 + 647.684570312 140.59375 637.911132812 168.0859375 618.293945312 186.7890625 c 128 + 598.747070312 205.5625 571.395507812 214.9140625 536.239257812 214.9140625 c 256 + 501.083007812 214.9140625 473.731445312 205.5625 454.184570312 186.7890625 c 128 + 434.567382812 168.0859375 424.793945312 140.59375 424.793945312 104.3125 c 2 + 424.793945312 92.21875 l 2 + 424.793945312 55.9375 434.567382812 28.4453125 454.184570312 9.671875 c 128 + 473.731445312 -9.03125 501.083007812 -18.3828125 536.239257812 -18.3828125 c 256 +1250.19238281 -97.8359375 m 0 + 1199.49707031 -97.8359375 1156.46582031 -88.625 1121.02832031 -70.203125 c 128 + 1085.59082031 -51.78125 1055.21582031 -27.03125 1029.90332031 4.1171875 c 1 + 1097.26269531 67.1875 l 1 + 1118.56738281 41.2421875 1142.05175781 21.625 1167.64550781 8.40625 c 128 + 1193.30957031 -4.8125 1222.55957031 -11.4921875 1255.39550781 -11.4921875 c 0 + 1293.99707031 -11.4921875 1323.03613281 -2.84375 1342.65332031 14.453125 c 128 + 1362.20019531 31.75 1372.04394531 55.09375 1372.04394531 84.4140625 c 0 + 1372.04394531 108.0390625 1365.08300781 126.7421875 1351.30175781 140.59375 c 128 + 1337.45019531 154.4453125 1312.98144531 164.78125 1277.82519531 171.671875 c 2 + 1224.24707031 181.234375 l 2 + 1165.53613281 192.1328125 1121.45019531 211.46875 1092.05957031 239.1015625 c 128 + 1062.66894531 266.734375 1048.04394531 304.7734375 1048.04394531 353.1484375 c 0 + 1048.04394531 379.65625 1053.03613281 403.703125 1063.16113281 425.2890625 c 128 + 1073.21582031 446.875 1087.34863281 465.015625 1105.48925781 479.7109375 c 128 + 1123.62988281 494.40625 1145.63769531 505.796875 1171.58300781 513.8125 c 128 + 1197.45800781 521.8984375 1226.56738281 525.90625 1258.84082031 525.90625 c 0 + 1304.33300781 525.90625 1343.77832031 518.03125 1377.17675781 502.2109375 c 128 + 1410.57519531 486.3203125 1439.12207031 463.46875 1462.74707031 433.515625 c 1 + 1394.47363281 373.046875 l 1 + 1378.93457031 393.15625 1359.95019531 409.328125 1337.45019531 421.421875 c 128 + 1315.02050781 433.515625 1287.03613281 439.5625 1253.63769531 439.5625 c 0 + 1219.11425781 439.5625 1192.32519531 432.6015625 1173.27050781 418.8203125 c 128 + 1154.28613281 404.96875 1144.79394531 384.7890625 1144.79394531 358.3515625 c 0 + 1144.79394531 332.96875 1152.52832031 314.125 1168.13769531 301.75 c 128 + 1183.67675781 289.375 1207.86425781 279.953125 1240.70019531 273.625 c 2 + 1294.27832031 262.4453125 l 2 + 1354.74707031 250.9140625 1398.97363281 231.296875 1426.88769531 203.6640625 c 128 + 1454.80175781 176.03125 1468.79394531 137.9921875 1468.79394531 89.6171875 c 0 + 1468.79394531 61.421875 1463.87207031 35.7578125 1454.09863281 12.6953125 c 128 + 1444.32519531 -10.296875 1430.05175781 -30.0546875 1411.34863281 -46.4375 c 128 + 1392.57519531 -62.890625 1369.72363281 -75.546875 1342.65332031 -84.4765625 c 128 + 1315.58300781 -93.40625 1284.71582031 -97.8359375 1250.19238281 -97.8359375 c 0 +268.12890625 735.5 m 1 + 70.26953125 1338.5703125 l 1 + 171.37890625 1338.5703125 l 1 + 267.28515625 1040.515625 l 1 + 325.15234375 830.5625 l 1 + 328.59765625 830.5625 l 1 + 387.37890625 1040.515625 l 1 + 483.28515625 1338.5703125 l 1 + 581.79296875 1338.5703125 l 1 + 381.33203125 735.5 l 1 + 268.12890625 735.5 l 1 +802.64453125 735.5 m 1 + 705.05078125 735.5 l 1 + 705.05078125 1338.5703125 l 1 + 965.06640625 1338.5703125 l 2 + 1019.27734375 1338.5703125 1061.88671875 1322.328125 1092.96484375 1289.7734375 c 128 + 1124.04296875 1257.21875 1139.65234375 1212.9921875 1139.65234375 1157.1640625 c 0 + 1139.65234375 1113.921875 1129.66796875 1078.0625 1109.83984375 1049.5859375 c 128 + 1089.94140625 1021.0390625 1060.69140625 1001.0703125 1022.08984375 989.5390625 c 1 + 1152.58984375 735.5 l 1 + 1043.74609375 735.5 l 1 + 922.73828125 979.1328125 l 1 + 802.64453125 979.1328125 l 1 + 802.64453125 735.5 l 1 +958.17578125 1061.2578125 m 2 + 982.92578125 1061.2578125 1002.26171875 1067.7265625 1016.04296875 1080.6640625 c 128 + 1029.89453125 1093.6015625 1036.78515625 1112.234375 1036.78515625 1136.421875 c 2 + 1036.78515625 1177.8359375 l 2 + 1036.78515625 1202.09375 1029.89453125 1220.65625 1016.04296875 1233.59375 c 128 + 1002.26171875 1246.53125 982.92578125 1253.0703125 958.17578125 1253.0703125 c 2 + 802.64453125 1253.0703125 l 1 + 802.64453125 1061.2578125 l 1 + 958.17578125 1061.2578125 l 2 +1507.38671875 725.1640625 m 0 + 1428.49609375 725.1640625 1366.55078125 751.7421875 1321.62109375 805.0390625 c 128 + 1276.69140625 858.3359375 1254.26171875 935.6796875 1254.26171875 1037.0703125 c 0 + 1254.26171875 1087.6953125 1260.02734375 1132.34375 1271.55859375 1170.9453125 c 128 + 1283.01953125 1209.546875 1299.75390625 1242.1015625 1321.62109375 1268.609375 c 128 + 1343.55859375 1295.1171875 1370.13671875 1315.0859375 1401.56640625 1328.65625 c 128 + 1432.92578125 1342.15625 1468.22265625 1348.90625 1507.38671875 1348.90625 c 0 + 1559.83984375 1348.90625 1603.71484375 1337.4453125 1639.15234375 1314.3828125 c 128 + 1674.58984375 1291.3203125 1702.36328125 1257.359375 1722.54296875 1212.4296875 c 1 + 1640.48828125 1167.5 l 1 + 1630.08203125 1196.328125 1614.12109375 1219.1796875 1592.53515625 1236.1953125 c 128 + 1570.87890625 1253.2109375 1542.54296875 1261.6484375 1507.38671875 1261.6484375 c 0 + 1460.76953125 1261.6484375 1424.13671875 1245.828125 1397.69921875 1214.1875 c 128 + 1371.19140625 1182.4765625 1357.90234375 1138.671875 1357.90234375 1082.84375 c 2 + 1357.90234375 991.2265625 l 2 + 1357.90234375 935.3984375 1371.19140625 891.59375 1397.69921875 859.8828125 c 128 + 1424.13671875 828.2421875 1460.76953125 812.421875 1507.38671875 812.421875 c 0 + 1543.66796875 812.421875 1573.19921875 821.7734375 1595.98046875 840.4765625 c 128 + 1618.69140625 859.1796875 1635.56640625 883.2265625 1646.53515625 912.6171875 c 1 + 1725.14453125 865.0859375 l 1 + 1704.96484375 821.3515625 1676.76953125 787.0390625 1640.48828125 762.2890625 c 128 + 1604.13671875 737.5390625 1559.83984375 725.1640625 1507.38671875 725.1640625 c 0 +EndSplineSet +EndChar + +StartChar: uniF016 +Encoding: 61462 61462 7 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +EndUndoOperation +UndoOperation +Index: 1 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +765.548828125 -142.5 m 1 + 705.080078125 38.90625 l 1 + 454.533203125 38.90625 l 1 + 395.939453125 -142.5 l 1 + 285.548828125 -142.5 l 1 + 514.064453125 527.578125 l 1 + 650.392578125 527.578125 l 1 + 878.830078125 -142.5 l 1 + 765.548828125 -142.5 l 1 +582.189453125 427.734375 m 1 + 577.423828125 427.734375 l 1 + 480.470703125 132.03125 l 1 + 678.205078125 132.03125 l 1 + 582.189453125 427.734375 l 1 +1167.50195312 228.046875 m 1 + 1093.59570312 370.15625 l 1 + 1090.70507812 370.15625 l 1 + 1090.70507812 -142.5 l 1 + 987.033203125 -142.5 l 1 + 987.033203125 527.578125 l 1 + 1107.97070312 527.578125 l 1 + 1326.87695312 157.03125 l 1 + 1400.78320312 14.921875 l 1 + 1403.67382812 14.921875 l 1 + 1403.67382812 527.578125 l 1 + 1507.34570312 527.578125 l 1 + 1507.34570312 -142.5 l 1 + 1386.40820312 -142.5 l 1 + 1167.50195312 228.046875 l 1 +447.483398438 712.015625 m 0 + 391.155273438 712.015625 343.342773438 722.25 303.967773438 742.71875 c 128 + 264.592773438 763.1875 230.842773438 790.6875 202.717773438 825.296875 c 1 + 277.561523438 895.375 l 1 + 301.233398438 866.546875 327.327148438 844.75 355.764648438 830.0625 c 128 + 384.280273438 815.375 416.780273438 807.953125 453.264648438 807.953125 c 0 + 496.155273438 807.953125 528.420898438 817.5625 550.217773438 836.78125 c 128 + 571.936523438 856 582.874023438 881.9375 582.874023438 914.515625 c 0 + 582.874023438 940.765625 575.139648438 961.546875 559.827148438 976.9375 c 128 + 544.436523438 992.328125 517.249023438 1003.8125 478.186523438 1011.46875 c 2 + 418.655273438 1022.09375 l 2 + 353.420898438 1034.203125 304.436523438 1055.6875 271.780273438 1086.390625 c 128 + 239.124023438 1117.09375 222.874023438 1159.359375 222.874023438 1213.109375 c 0 + 222.874023438 1242.5625 228.420898438 1269.28125 239.670898438 1293.265625 c 128 + 250.842773438 1317.25 266.545898438 1337.40625 286.702148438 1353.734375 c 128 + 306.858398438 1370.0625 331.311523438 1382.71875 360.139648438 1391.625 c 128 + 388.889648438 1400.609375 421.233398438 1405.0625 457.092773438 1405.0625 c 0 + 507.639648438 1405.0625 551.467773438 1396.3125 588.577148438 1378.734375 c 128 + 625.686523438 1361.078125 657.405273438 1335.6875 683.655273438 1302.40625 c 1 + 607.795898438 1235.21875 l 1 + 590.530273438 1257.5625 569.436523438 1275.53125 544.436523438 1288.96875 c 128 + 519.514648438 1302.40625 488.420898438 1309.125 451.311523438 1309.125 c 0 + 412.952148438 1309.125 383.186523438 1301.390625 362.014648438 1286.078125 c 128 + 340.920898438 1270.6875 330.374023438 1248.265625 330.374023438 1218.890625 c 0 + 330.374023438 1190.6875 338.967773438 1169.75 356.311523438 1156 c 128 + 373.577148438 1142.25 400.452148438 1131.78125 436.936523438 1124.75 c 2 + 496.467773438 1112.328125 l 2 + 563.655273438 1099.515625 612.795898438 1077.71875 643.811523438 1047.015625 c 128 + 674.827148438 1016.3125 690.374023438 974.046875 690.374023438 920.296875 c 0 + 690.374023438 888.96875 684.905273438 860.453125 674.045898438 834.828125 c 128 + 663.186523438 809.28125 647.327148438 787.328125 626.545898438 769.125 c 128 + 605.686523438 750.84375 580.295898438 736.78125 550.217773438 726.859375 c 128 + 520.139648438 716.9375 485.842773438 712.015625 447.483398438 712.015625 c 0 +905.686523438 723.5 m 1 + 747.327148438 1393.578125 l 1 + 857.717773438 1393.578125 l 1 + 925.842773438 1071 l 1 + 972.952148438 848.265625 l 1 + 975.764648438 848.265625 l 1 + 1029.59277344 1071 l 1 + 1109.20214844 1393.578125 l 1 + 1230.21777344 1393.578125 l 1 + 1308.88964844 1071 l 1 + 1361.70214844 849.28125 l 1 + 1364.59277344 849.28125 l 1 + 1413.57714844 1071 l 1 + 1483.65527344 1393.578125 l 1 + 1590.21777344 1393.578125 l 1 + 1425.06152344 723.5 l 1 + 1303.18652344 723.5 l 1 + 1217.71777344 1070.0625 l 1 + 1167.79589844 1273.578125 l 1 + 1165.84277344 1273.578125 l 1 + 1114.98339844 1070.0625 l 1 + 1027.63964844 723.5 l 1 + 905.686523438 723.5 l 1 +EndSplineSet +EndChar + +StartChar: uniF01E +Encoding: 61470 61470 8 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +EndUndoOperation +UndoOperation +Index: 1 +Type: 3 +WasModified: 0 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +590.483398438 279.015625 m 0 + 534.155273438 279.015625 486.342773438 289.25 446.967773438 309.71875 c 128 + 407.592773438 330.1875 373.842773438 357.6875 345.717773438 392.296875 c 1 + 420.561523438 462.375 l 1 + 444.233398438 433.546875 470.327148438 411.75 498.764648438 397.0625 c 128 + 527.280273438 382.375 559.780273438 374.953125 596.264648438 374.953125 c 0 + 639.155273438 374.953125 671.420898438 384.5625 693.217773438 403.78125 c 128 + 714.936523438 423 725.874023438 448.9375 725.874023438 481.515625 c 0 + 725.874023438 507.765625 718.139648438 528.546875 702.827148438 543.9375 c 128 + 687.436523438 559.328125 660.249023438 570.8125 621.186523438 578.46875 c 2 + 561.655273438 589.09375 l 2 + 496.420898438 601.203125 447.436523438 622.6875 414.780273438 653.390625 c 128 + 382.124023438 684.09375 365.874023438 726.359375 365.874023438 780.109375 c 0 + 365.874023438 809.5625 371.420898438 836.28125 382.670898438 860.265625 c 128 + 393.842773438 884.25 409.545898438 904.40625 429.702148438 920.734375 c 128 + 449.858398438 937.0625 474.311523438 949.71875 503.139648438 958.625 c 128 + 531.889648438 967.609375 564.233398438 972.0625 600.092773438 972.0625 c 0 + 650.639648438 972.0625 694.467773438 963.3125 731.577148438 945.734375 c 128 + 768.686523438 928.078125 800.405273438 902.6875 826.655273438 869.40625 c 1 + 750.795898438 802.21875 l 1 + 733.530273438 824.5625 712.436523438 842.53125 687.436523438 855.96875 c 128 + 662.514648438 869.40625 631.420898438 876.125 594.311523438 876.125 c 0 + 555.952148438 876.125 526.186523438 868.390625 505.014648438 853.078125 c 128 + 483.920898438 837.6875 473.374023438 815.265625 473.374023438 785.890625 c 0 + 473.374023438 757.6875 481.967773438 736.75 499.311523438 723 c 128 + 516.577148438 709.25 543.452148438 698.78125 579.936523438 691.75 c 2 + 639.467773438 679.328125 l 2 + 706.655273438 666.515625 755.795898438 644.71875 786.811523438 614.015625 c 128 + 817.827148438 583.3125 833.374023438 541.046875 833.374023438 487.296875 c 0 + 833.374023438 455.96875 827.905273438 427.453125 817.045898438 401.828125 c 128 + 806.186523438 376.28125 790.327148438 354.328125 769.545898438 336.125 c 128 + 748.686523438 317.84375 723.295898438 303.78125 693.217773438 293.859375 c 128 + 663.139648438 283.9375 628.842773438 279.015625 590.483398438 279.015625 c 0 +1052.59277344 960.578125 m 1 + 1052.59277344 547.765625 l 2 + 1052.59277344 490.8125 1063.45214844 447.921875 1085.17089844 419.171875 c 128 + 1106.96777344 390.34375 1144.07714844 375.96875 1196.57714844 375.96875 c 256 + 1249.07714844 375.96875 1286.18652344 390.34375 1307.90527344 419.171875 c 128 + 1329.70214844 447.921875 1340.56152344 490.8125 1340.56152344 547.765625 c 2 + 1340.56152344 960.578125 l 1 + 1447.12402344 960.578125 l 1 + 1447.12402344 565.03125 l 2 + 1447.12402344 515.8125 1442.67089844 473.234375 1433.68652344 437.375 c 128 + 1424.70214844 401.515625 1410.32714844 371.90625 1390.48339844 348.546875 c 128 + 1370.63964844 325.1875 1344.85839844 307.765625 1313.21777344 296.28125 c 128 + 1281.49902344 284.71875 1242.67089844 279.015625 1196.57714844 279.015625 c 256 + 1150.48339844 279.015625 1111.57714844 284.71875 1079.93652344 296.28125 c 128 + 1048.21777344 307.765625 1022.51464844 325.1875 1002.67089844 348.546875 c 128 + 982.827148438 371.90625 968.374023438 401.515625 959.467773438 437.375 c 128 + 950.483398438 473.234375 946.030273438 515.8125 946.030273438 565.03125 c 2 + 946.030273438 960.578125 l 1 + 1052.59277344 960.578125 l 1 +EndSplineSet +EndChar + +StartChar: uniF028 +Encoding: 61480 61480 9 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 1 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +EndUndoOperation +UndoOperation +Index: 1 +Type: 3 +WasModified: 1 +WasOrder2: 0 +Layer: 2 +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +1149 -164.5 m 5 + 999 -164.5 l 6 + 940 -164.5 896 -148.5 868 -118.5 c 132 + 840 -88.5 827 -47.5 827 3.5 c 6 + 827 83.5 l 5 + 768 90.5 713 108.5 666 135.5 c 132 + 619 162.5 579 200.5 546 245.5 c 132 + 513 290.5 486 345.5 468 409.5 c 132 + 450 473.5 441 544.5 441 625.5 c 4 + 441 714.5 452 793.5 474 861.5 c 132 + 496 929.5 526 985.5 566 1031.5 c 132 + 606 1077.5 654 1111.5 710 1135.5 c 132 + 766 1159.5 827 1171.5 896 1171.5 c 260 + 965 1171.5 1027 1159.5 1083 1135.5 c 132 + 1139 1111.5 1187 1077.5 1227 1031.5 c 132 + 1267 985.5 1297 929.5 1319 861.5 c 132 + 1341 793.5 1351 714.5 1351 625.5 c 4 + 1351 468.5 1319 344.5 1253 253.5 c 132 + 1188 162.5 1099 106.5 987 87.5 c 5 + 987 -20.5 l 5 + 1149 -20.5 l 5 + 1149 -164.5 l 5 +896 233.5 m 4 + 936 233.5 973 239.5 1007 253.5 c 132 + 1041 267.5 1070 288.5 1094 315.5 c 132 + 1118 342.5 1136 375.5 1149 413.5 c 132 + 1162 451.5 1168 495.5 1168 543.5 c 6 + 1168 709.5 l 6 + 1168 757.5 1162 801.5 1149 839.5 c 132 + 1136 877.5 1118 908.5 1094 935.5 c 132 + 1070 962.5 1041 983.5 1007 997.5 c 132 + 973 1011.5 936 1019.5 896 1019.5 c 4 + 855 1019.5 817 1011.5 784 997.5 c 132 + 751 983.5 723 962.5 699 935.5 c 132 + 675 908.5 657 877.5 644 839.5 c 132 + 631 801.5 624 757.5 624 709.5 c 6 + 624 543.5 l 6 + 624 495.5 631 451.5 644 413.5 c 132 + 657 375.5 675 342.5 699 315.5 c 132 + 723 288.5 751 267.5 784 253.5 c 132 + 817 239.5 855 233.5 896 233.5 c 4 +EndSplineSet +EndChar + +StartChar: uniF015 +Encoding: 61461 61461 10 +Width: 1792 +Flags: H +LayerCount: 2 +UndoRedoHistory +Layer: 1 +Undoes +UndoOperation +Index: 0 +Type: 1 +WasModified: 1 +WasOrder2: 0 +Layer: 2 +Width: 1792 +VWidth: 1792 +LBearingChange: 0 +UnicodeEnc: 0 +InstructionsLength: 0 +SplineSet +14.755859375 1069.5703125 m 5 + 259.302734375 1069.5703125 l 6 + 305.919921875 1069.5703125 341.357421875 1056.3515625 365.544921875 1029.84375 c 132 + 389.732421875 1003.3359375 401.826171875 964.734375 401.826171875 914.0390625 c 4 + 401.826171875 875.4375 393.458984375 845.203125 376.794921875 823.3359375 c 132 + 360.060546875 801.46875 336.154296875 789.09375 305.076171875 786.2109375 c 5 + 305.076171875 775.8046875 l 5 + 322.373046875 775.8046875 338.052734375 772.5 352.185546875 765.890625 c 132 + 366.248046875 759.28125 378.482421875 749.859375 388.888671875 737.765625 c 132 + 399.224609375 725.671875 407.310546875 711.328125 413.076171875 694.59375 c 132 + 418.841796875 677.859375 421.724609375 659.71875 421.724609375 640.171875 c 4 + 421.724609375 614.2265625 418.419921875 590.6015625 411.810546875 569.296875 c 132 + 405.130859375 547.9921875 395.779296875 529.7109375 383.685546875 514.453125 c 132 + 371.591796875 499.1953125 357.037109375 487.3828125 340.091796875 479.015625 c 132 + 323.076171875 470.6484375 304.232421875 466.5 283.490234375 466.5 c 6 + 14.755859375 466.5 l 5 + 14.755859375 1069.5703125 l 5 +106.373046875 546.8671875 m 5 + 256.701171875 546.8671875 l 6 + 278.568359375 546.8671875 295.302734375 552.7734375 306.833984375 564.5859375 c 132 + 318.294921875 576.3984375 324.060546875 595.2421875 324.060546875 621.1875 c 6 + 324.060546875 660.9140625 l 6 + 324.060546875 686.7890625 318.294921875 705.703125 306.833984375 717.515625 c 132 + 295.302734375 729.328125 278.568359375 735.234375 256.701171875 735.234375 c 6 + 106.373046875 735.234375 l 5 + 106.373046875 546.8671875 l 5 +106.373046875 813.84375 m 5 + 242.005859375 813.84375 l 6 + 262.185546875 813.84375 277.724609375 819.1875 288.623046875 829.8046875 c 132 + 299.591796875 840.4921875 305.076171875 857.859375 305.076171875 882.1171875 c 6 + 305.076171875 920.9296875 l 6 + 305.076171875 945.1875 299.591796875 962.5546875 288.623046875 973.2421875 c 132 + 277.724609375 983.859375 262.185546875 989.203125 242.005859375 989.203125 c 6 + 106.373046875 989.203125 l 5 + 106.373046875 813.84375 l 5 +518.755859375 466.5 m 5 + 518.755859375 1069.5703125 l 5 + 868.701171875 1069.5703125 l 5 + 868.701171875 989.203125 l 5 + 610.373046875 989.203125 l 5 + 610.373046875 812.9296875 l 5 + 843.599609375 812.9296875 l 5 + 843.599609375 733.4765625 l 5 + 610.373046875 733.4765625 l 5 + 610.373046875 546.8671875 l 5 + 868.701171875 546.8671875 l 5 + 868.701171875 466.5 l 5 + 518.755859375 466.5 l 5 +950.755859375 466.5 m 5 + 950.755859375 1069.5703125 l 5 + 1300.70117188 1069.5703125 l 5 + 1300.70117188 989.203125 l 5 + 1042.37304688 989.203125 l 5 + 1042.37304688 812.9296875 l 5 + 1275.59960938 812.9296875 l 5 + 1275.59960938 733.4765625 l 5 + 1042.37304688 733.4765625 l 5 + 1042.37304688 546.8671875 l 5 + 1300.70117188 546.8671875 l 5 + 1300.70117188 466.5 l 5 + 950.755859375 466.5 l 5 +1382.75585938 466.5 m 5 + 1382.75585938 1069.5703125 l 5 + 1621.25585938 1069.5703125 l 6 + 1673.07617188 1069.5703125 1712.09960938 1054.171875 1738.32617188 1023.375 c 132 + 1764.48242188 992.5078125 1777.63085938 948.0703125 1777.63085938 889.8515625 c 260 + 1777.63085938 831.703125 1764.48242188 787.1953125 1738.32617188 756.3984375 c 132 + 1712.09960938 725.53125 1673.07617188 710.1328125 1621.25585938 710.1328125 c 6 + 1474.37304688 710.1328125 l 5 + 1474.37304688 466.5 l 5 + 1382.75585938 466.5 l 5 +1474.37304688 791.34375 m 5 + 1613.45117188 791.34375 l 6 + 1635.31835938 791.34375 1651.91210938 796.96875 1663.16210938 808.21875 c 132 + 1674.34179688 819.46875 1679.96679688 837.46875 1679.96679688 862.21875 c 6 + 1679.96679688 917.484375 l 6 + 1679.96679688 942.3046875 1674.34179688 960.3046875 1663.16210938 971.484375 c 132 + 1651.91210938 982.734375 1635.31835938 988.359375 1613.45117188 988.359375 c 6 + 1474.37304688 988.359375 l 5 + 1474.37304688 791.34375 l 5 +EndSplineSet +EndUndoOperation +EndUndoes +Redoes +EndRedoes +EndUndoRedoHistory +Fore +SplineSet +14.755859375 927.0703125 m 1 + 259.302734375 927.0703125 l 2 + 305.919921875 927.0703125 341.357421875 913.8515625 365.544921875 887.34375 c 128 + 389.732421875 860.8359375 401.826171875 822.234375 401.826171875 771.5390625 c 0 + 401.826171875 732.9375 393.458984375 702.703125 376.794921875 680.8359375 c 128 + 360.060546875 658.96875 336.154296875 646.59375 305.076171875 643.7109375 c 1 + 305.076171875 633.3046875 l 1 + 322.373046875 633.3046875 338.052734375 630 352.185546875 623.390625 c 128 + 366.248046875 616.78125 378.482421875 607.359375 388.888671875 595.265625 c 128 + 399.224609375 583.171875 407.310546875 568.828125 413.076171875 552.09375 c 128 + 418.841796875 535.359375 421.724609375 517.21875 421.724609375 497.671875 c 0 + 421.724609375 471.7265625 418.419921875 448.1015625 411.810546875 426.796875 c 128 + 405.130859375 405.4921875 395.779296875 387.2109375 383.685546875 371.953125 c 128 + 371.591796875 356.6953125 357.037109375 344.8828125 340.091796875 336.515625 c 128 + 323.076171875 328.1484375 304.232421875 324 283.490234375 324 c 2 + 14.755859375 324 l 1 + 14.755859375 927.0703125 l 1 +106.373046875 404.3671875 m 1 + 256.701171875 404.3671875 l 2 + 278.568359375 404.3671875 295.302734375 410.2734375 306.833984375 422.0859375 c 128 + 318.294921875 433.8984375 324.060546875 452.7421875 324.060546875 478.6875 c 2 + 324.060546875 518.4140625 l 2 + 324.060546875 544.2890625 318.294921875 563.203125 306.833984375 575.015625 c 128 + 295.302734375 586.828125 278.568359375 592.734375 256.701171875 592.734375 c 2 + 106.373046875 592.734375 l 1 + 106.373046875 404.3671875 l 1 +106.373046875 671.34375 m 1 + 242.005859375 671.34375 l 2 + 262.185546875 671.34375 277.724609375 676.6875 288.623046875 687.3046875 c 128 + 299.591796875 697.9921875 305.076171875 715.359375 305.076171875 739.6171875 c 2 + 305.076171875 778.4296875 l 2 + 305.076171875 802.6875 299.591796875 820.0546875 288.623046875 830.7421875 c 128 + 277.724609375 841.359375 262.185546875 846.703125 242.005859375 846.703125 c 2 + 106.373046875 846.703125 l 1 + 106.373046875 671.34375 l 1 +518.755859375 324 m 1 + 518.755859375 927.0703125 l 1 + 868.701171875 927.0703125 l 1 + 868.701171875 846.703125 l 1 + 610.373046875 846.703125 l 1 + 610.373046875 670.4296875 l 1 + 843.599609375 670.4296875 l 1 + 843.599609375 590.9765625 l 1 + 610.373046875 590.9765625 l 1 + 610.373046875 404.3671875 l 1 + 868.701171875 404.3671875 l 1 + 868.701171875 324 l 1 + 518.755859375 324 l 1 +950.755859375 324 m 1 + 950.755859375 927.0703125 l 1 + 1300.70117188 927.0703125 l 1 + 1300.70117188 846.703125 l 1 + 1042.37304688 846.703125 l 1 + 1042.37304688 670.4296875 l 1 + 1275.59960938 670.4296875 l 1 + 1275.59960938 590.9765625 l 1 + 1042.37304688 590.9765625 l 1 + 1042.37304688 404.3671875 l 1 + 1300.70117188 404.3671875 l 1 + 1300.70117188 324 l 1 + 950.755859375 324 l 1 +1382.75585938 324 m 1 + 1382.75585938 927.0703125 l 1 + 1621.25585938 927.0703125 l 2 + 1673.07617188 927.0703125 1712.09960938 911.671875 1738.32617188 880.875 c 128 + 1764.48242188 850.0078125 1777.63085938 805.5703125 1777.63085938 747.3515625 c 256 + 1777.63085938 689.203125 1764.48242188 644.6953125 1738.32617188 613.8984375 c 128 + 1712.09960938 583.03125 1673.07617188 567.6328125 1621.25585938 567.6328125 c 2 + 1474.37304688 567.6328125 l 1 + 1474.37304688 324 l 1 + 1382.75585938 324 l 1 +1474.37304688 648.84375 m 1 + 1613.45117188 648.84375 l 2 + 1635.31835938 648.84375 1651.91210938 654.46875 1663.16210938 665.71875 c 128 + 1674.34179688 676.96875 1679.96679688 694.96875 1679.96679688 719.71875 c 2 + 1679.96679688 774.984375 l 2 + 1679.96679688 799.8046875 1674.34179688 817.8046875 1663.16210938 828.984375 c 128 + 1651.91210938 840.234375 1635.31835938 845.859375 1613.45117188 845.859375 c 2 + 1474.37304688 845.859375 l 1 + 1474.37304688 648.84375 l 1 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/res/icons.ttf b/res/icons.ttf new file mode 100644 index 000000000..ee215107a Binary files /dev/null and b/res/icons.ttf differ diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index acd0cc77b..875ff487d 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -485,6 +485,12 @@ class DivDispatch { */ virtual bool keyOffAffectsPorta(int ch); + /** + * test whether volume is global. + * @return whether it is. + */ + virtual bool isVolGlobal(); + /** * get the lowest note in a portamento. * @param ch the channel in question. diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index 2e8532603..61d8344a9 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -216,13 +216,6 @@ void DivDispatchContainer::clear() { if (dispatch->getDCOffRequired()) { dcOffCompensation=true; } - // run for one cycle to determine DC offset - // TODO: SAA1099 doesn't like that - /*dispatch->acquire(bbIn[0],bbIn[1],0,1); - temp[0]=bbIn[0][0]; - temp[1]=bbIn[1][0]; - prevSample[0]=temp[0]; - prevSample[1]=temp[1];*/ } void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) { @@ -479,7 +472,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do break; case DIV_SYSTEM_NAMCO: dispatch=new DivPlatformNamcoWSG; - // Pac-Man (TODO: support Pole Position?) + // Pac-Man ((DivPlatformNamcoWSG*)dispatch)->setDeviceType(1); break; case DIV_SYSTEM_NAMCO_15XX: diff --git a/src/engine/fileOps.cpp b/src/engine/fileOps.cpp index 0ba5a1327..9cf94547b 100644 --- a/src/engine/fileOps.cpp +++ b/src/engine/fileOps.cpp @@ -2346,7 +2346,7 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } } - if (ds.version>=136) song.patchbayAuto=reader.readC(); + if (ds.version>=136) ds.patchbayAuto=reader.readC(); if (ds.version>=138) { ds.brokenPortaLegato=reader.readC(); diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 82694e003..2be22d1f4 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -86,6 +86,10 @@ bool DivDispatch::keyOffAffectsPorta(int ch) { return false; } +bool DivDispatch::isVolGlobal() { + return false; +} + int DivDispatch::getPortaFloor(int ch) { return 0x00; } diff --git a/src/engine/platform/c64.cpp b/src/engine/platform/c64.cpp index 6ca85ffe0..15ff00d92 100644 --- a/src/engine/platform/c64.cpp +++ b/src/engine/platform/c64.cpp @@ -566,6 +566,10 @@ bool DivPlatformC64::getWantPreNote() { return true; } +bool DivPlatformC64::isVolGlobal() { + return true; +} + float DivPlatformC64::getPostAmp() { return (sidCore==1)?3.0f:1.0f; } diff --git a/src/engine/platform/c64.h b/src/engine/platform/c64.h index 0da59fc83..def32eaab 100644 --- a/src/engine/platform/c64.h +++ b/src/engine/platform/c64.h @@ -105,6 +105,7 @@ class DivPlatformC64: public DivDispatch { void notifyInsChange(int ins); bool getDCOffRequired(); bool getWantPreNote(); + bool isVolGlobal(); float getPostAmp(); DivMacroInt* getChanMacroInt(int ch); void notifyInsDeletion(void* ins); diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index 1d72760a6..2d283d9a6 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -28,6 +28,8 @@ #define CHIP_FREQBASE 1180068 +#define DRUM_VOL(_x) (drumActivated[_x]?drumVol[_x]:15) + const unsigned char cycleMapOPLL[18]={ 8, 7, 6, 7, 8, 7, 8, 6, 0, 1, 2, 7, 8, 9, 3, 4, 5, 9 }; @@ -52,7 +54,7 @@ void DivPlatformOPLL::acquire_nuked(short** buf, size_t len) { QueuedWrite& w=writes.front(); if (w.addrOrVal) { OPLL_Write(&fm,1,w.val); - //printf("write: %x = %.2x\n",w.addr,w.val); + //logV("write: %x = %.2x",w.addr,w.val); regPool[w.addr&0xff]=w.val; writes.pop(); delay=21; @@ -104,10 +106,10 @@ void DivPlatformOPLL::tick(bool sysTick) { if (i>=6 && properDrums) { drumVol[i-6]=15-chan[i].outVol; - rWrite(0x36,drumVol[0]); - rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); - rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); - } else if (i<6 || !drums) { + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); + } else if (i<6 || !crapDrums) { if (i<9) { rWrite(0x30+i,((15-VOL_SCALE_LOG_BROKEN(chan[i].outVol,15-chan[i].state.op[1].tl,15))&15)|(chan[i].state.opllPreset<<4)); } @@ -230,16 +232,16 @@ void DivPlatformOPLL::tick(bool sysTick) { if (i>=6 && properDrums) { drumState&=~(0x10>>(i-6)); immWrite(0x0e,0x20|drumState); - logV("properDrums %d",i); - } else if (i>=6 && drums) { + //logV("properDrums %d",i); + } else if (i>=6 && crapDrums) { drumState&=~(0x10>>(chan[i].note%12)); immWrite(0x0e,0x20|drumState); - logV("drums %d",i); + //logV("drums %d",i); } else { if (i<9) { immWrite(0x20+i,(chan[i].freqH)|(chan[i].state.alg?0x20:0)); } - logV("normal %d",i); + //logV("normal %d",i); } //chan[i].keyOn=false; chan[i].keyOff=false; @@ -265,7 +267,21 @@ void DivPlatformOPLL::tick(bool sysTick) { if (i>=6 && properDrums && (i<9 || !noTopHatFreq)) { immWrite(0x10+drumSlot[i],freqt&0xff); immWrite(0x20+drumSlot[i],freqt>>8); - } else if (i<6 || !drums) { + switch (i) { + case 7: + lastFreqSH=0; + break; + case 8: + lastFreqTT=0; + break; + case 9: + lastFreqTT=1; + break; + case 19: + lastFreqSH=1; + break; + } + } else if (i<6 || !crapDrums) { if (i<9) { immWrite(0x10+i,freqt&0xff); } @@ -278,7 +294,7 @@ void DivPlatformOPLL::tick(bool sysTick) { immWrite(0x0e,0x20|drumState); } chan[i].keyOn=false; - } else if (chan[i].keyOn && i>=6 && drums) { + } else if (chan[i].keyOn && i>=6 && crapDrums) { //printf("%d\n",chan[i].note%12); drumState|=(0x10>>(chan[i].note%12)); immWrite(0x0e,0x20|drumState); @@ -365,22 +381,24 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) { } if (chan[ch].state.opllPreset==16) { // compatible drums mode if (ch>=6) { - drums=true; - immWrite(0x16,0x20); - immWrite(0x26,0x05); - immWrite(0x16,0x20); - immWrite(0x26,0x05); - immWrite(0x17,0x50); - immWrite(0x27,0x05); - immWrite(0x17,0x50); - immWrite(0x27,0x05); - immWrite(0x18,0xC0); - immWrite(0x28,0x01); + if (!properDrumsSys) { + crapDrums=true; + immWrite(0x16,0x20); + immWrite(0x26,0x05); + immWrite(0x16,0x20); + immWrite(0x26,0x05); + immWrite(0x17,0x50); + immWrite(0x27,0x05); + immWrite(0x17,0x50); + immWrite(0x27,0x05); + immWrite(0x18,0xC0); + immWrite(0x28,0x01); + } } } else { if (ch>=6) { - if (drums) { - drums=false; + if (crapDrums) { + crapDrums=false; immWrite(0x0e,0); drumState=0; } @@ -395,10 +413,40 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) { void DivPlatformOPLL::switchMode(bool mode) { if (mode==properDrums) return; if (mode) { + //logV("mode switch to DRUMS"); + for (int i=0; i<5; i++) { + drumActivated[i]=chan[6+i].keyOn; + } + immWrite(0x26,0); + immWrite(0x27,0); + immWrite(0x28,0); + immWrite(0x16,0); + immWrite(0x17,0); + immWrite(0x18,0); + immWrite(0x0e,0x20); + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); + oldWrites[0x36]=-1; + oldWrites[0x37]=-1; + oldWrites[0x38]=-1; } else { - + //logV("mode switch to NORMAL"); + immWrite(0x0e,0x20); + immWrite(0x0e,0x00); + for (int i=6; i<9; i++) { + if (chan[i].active) { + chan[i].freqChanged=true; + chan[i].keyOff=false; + chan[i].keyOn=true; + oldWrites[0x30+i]=-1; + } + chan[i].insChanged=true; + } } + properDrums=mode; + drumState=0; } int DivPlatformOPLL::dispatch(DivCommand c) { @@ -417,18 +465,31 @@ int DivPlatformOPLL::dispatch(DivCommand c) { if (c.chan>=6 && properDrums) { // drums mode chan[c.chan].insChanged=false; + drumActivated[c.chan-6]=true; if (c.value!=DIV_NOTE_NULL) { if (chan[c.chan].state.opllPreset==16 && chan[c.chan].state.fixedDrums) { - switch (c.chan) { - case 6: - chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9); - break; - case 7: case 10: - chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); - break; - case 8: case 9: - chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); - break; + if (fixedAll) { + chan[6].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9); + chan[7].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); + chan[8].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); + chan[9].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); + chan[10].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); + + chan[7].freqChanged=true; + chan[8].freqChanged=true; + chan[9].freqChanged=true; + } else { + switch (c.chan) { + case 6: + chan[c.chan].fixedFreq=(chan[c.chan].state.kickFreq&511)<<(chan[c.chan].state.kickFreq>>9); + break; + case 7: case 10: + chan[c.chan].fixedFreq=(chan[c.chan].state.snareHatFreq&511)<<(chan[c.chan].state.snareHatFreq>>9); + break; + case 8: case 9: + chan[c.chan].fixedFreq=(chan[c.chan].state.tomTopFreq&511)<<(chan[c.chan].state.tomTopFreq>>9); + break; + } } } else { chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); @@ -438,6 +499,10 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } chan[c.chan].keyOn=true; chan[c.chan].active=true; + + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); break; } @@ -448,7 +513,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { chan[c.chan].baseFreq=NOTE_FREQUENCY(c.value); chan[c.chan].note=c.value; - if (c.chan>=6 && drums) { + if (c.chan>=6 && crapDrums) { switch (chan[c.chan].note%12) { case 0: // kick drumVol[0]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15); @@ -466,9 +531,9 @@ int DivPlatformOPLL::dispatch(DivCommand c) { drumVol[4]=(15-(chan[c.chan].outVol*(15-chan[c.chan].state.op[1].tl))/15); break; } - rWrite(0x36,drumVol[0]); - rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); - rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); } chan[c.chan].freqChanged=true; } @@ -503,11 +568,11 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } if (c.chan>=6 && properDrums) { drumVol[c.chan-6]=15-chan[c.chan].outVol; - rWrite(0x36,drumVol[0]); - rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); - rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); break; - } else if (c.chan<6 || !drums) { + } else if (c.chan<6 || !crapDrums) { if (c.chan<9) { rWrite(0x30+c.chan,((15-VOL_SCALE_LOG_BROKEN(chan[c.chan].outVol,15-chan[c.chan].state.op[1].tl,15))&15)|(chan[c.chan].state.opllPreset<<4)); } @@ -565,7 +630,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { } case DIV_CMD_LEGATO: { if (c.chan>=9 && !properDrums) return 0; - if (c.chan<6 || (!drums && !properDrums)) { + if (c.chan<6 || (!crapDrums && !properDrums)) { if (chan[c.chan].insChanged) { DivInstrument* ins=parent->getIns(chan[c.chan].ins,DIV_INS_OPLL); commitState(c.chan,ins); @@ -780,12 +845,7 @@ int DivPlatformOPLL::dispatch(DivCommand c) { case DIV_CMD_FM_EXTCH: if (!properDrumsSys) break; if ((int)properDrums==c.value) break; - if (c.value) { - properDrums=true; - } else { - properDrums=false; - } - switchMode(properDrums); + switchMode(c.value); break; case DIV_CMD_MACRO_OFF: chan[c.chan].std.mask(c.value,true); @@ -840,7 +900,7 @@ void DivPlatformOPLL::forceIns() { } } } - if (drums) { // WHAT?! FIX THIS! + if (crapDrums) { // WHAT?! FIX THIS! immWrite(0x16,0x20); immWrite(0x26,0x05); immWrite(0x16,0x20); @@ -852,11 +912,25 @@ void DivPlatformOPLL::forceIns() { immWrite(0x18,0xC0); immWrite(0x28,0x01); } - // restore drum volumes + // restore drum volumes and state if (properDrums) { - rWrite(0x36,drumVol[0]); - rWrite(0x37,drumVol[1]|(drumVol[4]<<4)); - rWrite(0x38,drumVol[3]|(drumVol[2]<<4)); + rWrite(0x36,DRUM_VOL(0)); + rWrite(0x37,DRUM_VOL(1)|(DRUM_VOL(4)<<4)); + rWrite(0x38,DRUM_VOL(3)|(DRUM_VOL(2)<<4)); + + if (lastFreqSH==0) { + chan[7].freqChanged=true; + } else if (lastFreqSH==1) { + chan[10].freqChanged=true; + } + + if (lastFreqTT==0) { + chan[8].freqChanged=true; + } else if (lastFreqTT==1) { + chan[9].freqChanged=true; + } + + chan[6].freqChanged=true; } drumState=0; } @@ -937,16 +1011,18 @@ void DivPlatformOPLL::reset() { drumState=0; lastCustomMemory=-1; - drumVol[0]=0; - drumVol[1]=0; - drumVol[2]=0; - drumVol[3]=0; - drumVol[4]=0; + for (int i=0; i<5; i++) { + drumVol[i]=0; + drumActivated[i]=true; + } delay=0; - drums=false; + crapDrums=false; properDrums=properDrumsSys; + lastFreqSH=-1; + lastFreqTT=-1; + if (properDrums) { immWrite(0x0e,0x20); } @@ -1012,6 +1088,7 @@ void DivPlatformOPLL::setFlags(const DivConfig& flags) { oscBuf[i]->rate=rate/2; } noTopHatFreq=flags.getBool("noTopHatFreq",false); + fixedAll=flags.getBool("fixedAll",false); } int DivPlatformOPLL::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index f5d79b39c..8bb6baa2c 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -59,12 +59,18 @@ class DivPlatformOPLL: public DivDispatch { unsigned char lastBusy; unsigned char drumState; unsigned char drumVol[5]; + bool drumActivated[5]; + + // -1: undefined + // 0: snare/tom + // 1: hi-hat/top + signed char lastFreqSH, lastFreqTT; unsigned char regPool[256]; bool useYMFM; - bool drums; - bool properDrums, properDrumsSys, noTopHatFreq; + bool crapDrums; + bool properDrums, properDrumsSys, noTopHatFreq, fixedAll; bool vrc7; unsigned char patchSet; diff --git a/src/engine/platform/ted.cpp b/src/engine/platform/ted.cpp index be5a379e7..a1e431bb4 100644 --- a/src/engine/platform/ted.cpp +++ b/src/engine/platform/ted.cpp @@ -257,6 +257,10 @@ void DivPlatformTED::forceIns() { updateCtrl=true; } +bool DivPlatformTED::isVolGlobal() { + return true; +} + void* DivPlatformTED::getChanState(int ch) { return &chan[ch]; } diff --git a/src/engine/platform/ted.h b/src/engine/platform/ted.h index 25c41e3d8..58b4d0b7d 100644 --- a/src/engine/platform/ted.h +++ b/src/engine/platform/ted.h @@ -54,6 +54,7 @@ class DivPlatformTED: public DivDispatch { public: void acquire(short** buf, size_t len); int dispatch(DivCommand c); + bool isVolGlobal(); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); diff --git a/src/engine/platform/vic20.cpp b/src/engine/platform/vic20.cpp index bd25b5284..05705f7c7 100644 --- a/src/engine/platform/vic20.cpp +++ b/src/engine/platform/vic20.cpp @@ -278,6 +278,10 @@ void DivPlatformVIC20::forceIns() { } } +bool DivPlatformVIC20::isVolGlobal() { + return true; +} + void* DivPlatformVIC20::getChanState(int ch) { return &chan[ch]; } diff --git a/src/engine/platform/vic20.h b/src/engine/platform/vic20.h index e233d9844..b1c1533ab 100644 --- a/src/engine/platform/vic20.h +++ b/src/engine/platform/vic20.h @@ -46,6 +46,7 @@ class DivPlatformVIC20: public DivDispatch { public: void acquire(short** buf, size_t len); int dispatch(DivCommand c); + bool isVolGlobal(); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 544d59250..d15933d65 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -1307,7 +1307,7 @@ bool DivEngine::nextTick(bool noAccum, bool inhibitLowLat) { } else { DivMacroInt* macroInt=disCont[dispatchOfChan[note.channel]].dispatch->getChanMacroInt(dispatchChanOfChan[note.channel]); if (macroInt!=NULL) { - if (macroInt->hasRelease) { + if (macroInt->hasRelease && !disCont[dispatchOfChan[note.channel]].dispatch->isVolGlobal()) { dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF_ENV,note.channel)); } else { dispatchCmd(DivCommand(DIV_CMD_NOTE_OFF,note.channel)); diff --git a/src/gui/chanOsc.cpp b/src/gui/chanOsc.cpp index e4e9e85fb..aa7c91b5b 100644 --- a/src/gui/chanOsc.cpp +++ b/src/gui/chanOsc.cpp @@ -131,6 +131,7 @@ void FurnaceGUI::drawChanOsc() { if (ImGui::BeginTable("ChanOscSettings",3)) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Columns"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -154,6 +155,7 @@ void FurnaceGUI::drawChanOsc() { } ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Automatic columns"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -169,6 +171,7 @@ void FurnaceGUI::drawChanOsc() { ImGui::EndTable(); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Amplitude"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -261,6 +264,7 @@ void FurnaceGUI::drawChanOsc() { if (ImGui::ColorPicker4("Color",(float*)&i.color)) { updateChanOscGradTex=true; } + ImGui::AlignTextToFramePadding(); ImGui::Text("Distance"); ImGui::SameLine(); float pDist=i.distance*100.0f; @@ -269,6 +273,7 @@ void FurnaceGUI::drawChanOsc() { updateChanOscGradTex=true; } + ImGui::AlignTextToFramePadding(); ImGui::Text("Spread"); ImGui::SameLine(); float pSpread=i.spread*100.0f; @@ -313,6 +318,7 @@ void FurnaceGUI::drawChanOsc() { ImGui::ColorPicker4("Color",(float*)&chanOscColor); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Text format:"); ImGui::SameLine(); ImGui::InputText("##TextFormat",&chanOscTextFormat); diff --git a/src/gui/compatFlags.cpp b/src/gui/compatFlags.cpp index f1b16c639..55f3cb589 100644 --- a/src/gui/compatFlags.cpp +++ b/src/gui/compatFlags.cpp @@ -199,6 +199,7 @@ void FurnaceGUI::drawCompatFlags() { } if (ImGui::BeginTabItem("Pitch/Playback")) { ImGui::Text("Pitch linearity:"); + ImGui::Indent(); if (ImGui::RadioButton("None",e->song.linearPitch==0)) { e->song.linearPitch=0; } @@ -217,6 +218,7 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("like Impulse Tracker"); } + ImGui::Unindent(); if (e->song.linearPitch==2) { ImGui::SameLine(); @@ -228,6 +230,7 @@ void FurnaceGUI::drawCompatFlags() { } ImGui::Text("Loop modality:"); + ImGui::Indent(); if (ImGui::RadioButton("Reset channels",e->song.loopModality==0)) { e->song.loopModality=0; } @@ -246,8 +249,10 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("select to not reset channels on loop."); } + ImGui::Unindent(); ImGui::Text("Cut/delay effect policy:"); + ImGui::Indent(); if (ImGui::RadioButton("Strict",e->song.delayBehavior==0)) { e->song.delayBehavior=0; } @@ -266,8 +271,10 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("no checks"); } + ImGui::Unindent(); ImGui::Text("Simultaneous jump (0B+0D) treatment:"); + ImGui::Indent(); if (ImGui::RadioButton("Normal",e->song.jumpTreatment==0)) { e->song.jumpTreatment=0; } @@ -286,6 +293,7 @@ void FurnaceGUI::drawCompatFlags() { if (ImGui::IsItemHovered()) { ImGui::SetTooltip("only accept 0Dxx"); } + ImGui::Unindent(); ImGui::EndTabItem(); } if (ImGui::BeginTabItem("Other")) { diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index bfeb9067e..9d59e44d2 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -486,6 +486,7 @@ void FurnaceGUI::drawDebug() { pgProgram.clear(); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Address"); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f*dpiScale); diff --git a/src/gui/doAction.cpp b/src/gui/doAction.cpp index 56f1e32f9..d26a1b310 100644 --- a/src/gui/doAction.cpp +++ b/src/gui/doAction.cpp @@ -589,14 +589,34 @@ void FurnaceGUI::doAction(int what) { case GUI_ACTION_PAT_EXPAND_SONG: doExpandSong(collapseAmount); break; - case GUI_ACTION_PAT_LATCH: // TODO + case GUI_ACTION_PAT_LATCH: { + DivPattern* pat=e->curPat[cursor.xCoarse].getPattern(e->curOrders->ord[cursor.xCoarse][curOrder],true); + latchIns=pat->data[cursor.y][2]; + latchVol=pat->data[cursor.y][3]; + latchEffect=pat->data[cursor.y][4]; + latchEffectVal=pat->data[cursor.y][5]; + latchTarget=0; + latchNibble=false; break; - case GUI_ACTION_PAT_SCROLL_MODE: // TODO - break; - case GUI_ACTION_PAT_CLEAR_LATCH: // TODO + } + case GUI_ACTION_PAT_CLEAR_LATCH: + latchIns=-2; + latchVol=-1; + latchEffect=-1; + latchEffectVal=-1; + latchTarget=0; + latchNibble=false; break; case GUI_ACTION_INS_LIST_ADD: + if (settings.insTypeMenu) { + makeInsTypeList=e->getPossibleInsTypes(); + if (makeInsTypeList.size()>1) { + displayInsTypeList=true; + displayInsTypeListMakeInsSample=-1; + break; + } + } curIns=e->addInstrument(cursor.xCoarse); if (curIns==-1) { showError("too many instruments!"); @@ -1265,7 +1285,7 @@ void FurnaceGUI::doAction(int what) { } else if (sample->depth==DIV_SAMPLE_DEPTH_8BIT) { for (unsigned int i=start; idata8[i]=-sample->data8[i]; - if (sample->data16[i]==-128) sample->data16[i]=127; + if (sample->data8[i]==-128) sample->data8[i]=127; } } diff --git a/src/gui/editControls.cpp b/src/gui/editControls.cpp index 099ff7e25..24aeb87cd 100644 --- a/src/gui/editControls.cpp +++ b/src/gui/editControls.cpp @@ -619,6 +619,7 @@ void FurnaceGUI::drawMobileControls() { "Furnace Amiga emulator is working properly by\n" "comparing it with real Amiga output." ); + ImGui::AlignTextToFramePadding(); ImGui::Text("Directory"); ImGui::SameLine(); ImGui::InputText("##AVDPath",&workingDirROMExport); @@ -717,6 +718,7 @@ void FurnaceGUI::drawEditControls() { e->setMetronome(metro); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Follow"); ImGui::SameLine(); unimportant(ImGui::Checkbox("Orders",&followOrders)); @@ -1063,6 +1065,7 @@ void FurnaceGUI::drawEditControls() { if (ImGui::Begin("Edit Controls",&editControlsOpen,globalWinFlags)) { ImGui::Columns(2); + ImGui::AlignTextToFramePadding(); ImGui::Text("Octave"); ImGui::SameLine(); float cursor=ImGui::GetCursorPosX(); @@ -1078,6 +1081,7 @@ void FurnaceGUI::drawEditControls() { } } + ImGui::AlignTextToFramePadding(); ImGui::Text("Step"); ImGui::SameLine(); ImGui::SetCursorPosX(cursor); diff --git a/src/gui/editing.cpp b/src/gui/editing.cpp index b9e035118..1e55d86e3 100644 --- a/src/gui/editing.cpp +++ b/src/gui/editing.cpp @@ -68,7 +68,7 @@ void FurnaceGUI::prepareUndo(ActionType action) { } break; case GUI_UNDO_PATTERN_COLLAPSE_SONG: - case GUI_UNDO_PATTERN_EXPAND_SONG: // TODO + case GUI_UNDO_PATTERN_EXPAND_SONG: // this is handled by doCollapseSong/doExpandSong break; case GUI_UNDO_REPLACE: // this is handled by doReplace() break; @@ -134,7 +134,7 @@ void FurnaceGUI::makeUndo(ActionType action) { } break; case GUI_UNDO_PATTERN_COLLAPSE_SONG: - case GUI_UNDO_PATTERN_EXPAND_SONG: // TODO + case GUI_UNDO_PATTERN_EXPAND_SONG: // this is handled by doCollapseSong/doExpandSong break; case GUI_UNDO_REPLACE: // this is handled by doReplace() break; diff --git a/src/gui/effectList.cpp b/src/gui/effectList.cpp index 2d1bd1f1e..0be9b159a 100644 --- a/src/gui/effectList.cpp +++ b/src/gui/effectList.cpp @@ -47,22 +47,56 @@ void FurnaceGUI::drawEffectList() { const char* prevName=NULL; for (int i=0; i<256; i++) { const char* name=e->getEffectDesc(i,cursor.xCoarse); - bool effectShow = true; + bool effectShow=true; if (name==prevName) { continue; } prevName=name; switch (fxColors[i]) { - case GUI_COLOR_PATTERN_EFFECT_MISC: effectShow = effectsShow[8]; break; - case GUI_COLOR_PATTERN_EFFECT_SONG: effectShow = effectsShow[1]; break; - case GUI_COLOR_PATTERN_EFFECT_SPEED: effectShow = effectsShow[3]; break; - case GUI_COLOR_PATTERN_EFFECT_TIME: effectShow = effectsShow[2]; break; - case GUI_COLOR_PATTERN_EFFECT_PITCH: effectShow = effectsShow[0]; break; - case GUI_COLOR_PATTERN_EFFECT_PANNING: effectShow = effectsShow[4]; break; - case GUI_COLOR_PATTERN_EFFECT_VOLUME: effectShow = effectsShow[5]; break; - case GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY: effectShow = effectsShow[6]; break; - case GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY: effectShow = effectsShow[7]; break; - default: effectShow = true; break; + case GUI_COLOR_PATTERN_EFFECT_MISC: + effectShow=effectsShow[8]; + break; + case GUI_COLOR_PATTERN_EFFECT_SONG: + effectShow=effectsShow[1]; + break; + case GUI_COLOR_PATTERN_EFFECT_SPEED: + effectShow=effectsShow[3]; + break; + case GUI_COLOR_PATTERN_EFFECT_TIME: + effectShow=effectsShow[2]; + break; + case GUI_COLOR_PATTERN_EFFECT_PITCH: + effectShow=effectsShow[0]; + break; + case GUI_COLOR_PATTERN_EFFECT_PANNING: + effectShow=effectsShow[4]; + break; + case GUI_COLOR_PATTERN_EFFECT_VOLUME: + effectShow=effectsShow[5]; + break; + case GUI_COLOR_PATTERN_EFFECT_SYS_PRIMARY: + effectShow=effectsShow[6]; + break; + case GUI_COLOR_PATTERN_EFFECT_SYS_SECONDARY: + effectShow=effectsShow[7]; + break; + default: + effectShow=true; + break; + } + if (fxColors[i]==GUI_COLOR_PATTERN_EFFECT_PANNING) { + DivDispatch* dispatch=e->getDispatch(e->dispatchOfChan[cursor.xCoarse]); + if (dispatch!=NULL) { + int outputs=dispatch->getOutputCount(); + if (outputs<2) { + effectShow=false; + } + if (outputs<3) { + if (i>=0x88 && i<=0x8f) { + effectShow=false; + } + } + } } if (name!=NULL && effectShow) { ImGui::TableNextRow(); diff --git a/src/gui/fileDialog.cpp b/src/gui/fileDialog.cpp index a0a45e1e0..b9ec5f69f 100644 --- a/src/gui/fileDialog.cpp +++ b/src/gui/fileDialog.cpp @@ -28,7 +28,6 @@ struct NFDState { } }; -// TODO: filter void _nfdThread(const NFDState state, std::atomic* ok, std::vector* result, bool* errorOutput) { nfdchar_t* out=NULL; nfdresult_t ret=NFD_CANCEL; diff --git a/src/gui/findReplace.cpp b/src/gui/findReplace.cpp index b6fcd14ce..60976d31c 100644 --- a/src/gui/findReplace.cpp +++ b/src/gui/findReplace.cpp @@ -595,6 +595,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableSetupColumn("c3",ImGuiTableColumnFlags_WidthStretch,0.25); ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Note"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -662,6 +663,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Ins"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -697,6 +699,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Volume"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -734,6 +737,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::PushID(0x1000+j); ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Effect"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -769,6 +773,7 @@ void FurnaceGUI::drawFindReplace() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Value"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 3e3601af6..6950c72f4 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -77,6 +77,14 @@ bool Particle::update(float frameTime) { return (life>0); } +void FurnaceGUI::centerNextWindow(const char* name, float w, float h) { + if (ImGui::IsPopupOpen(name)) { + if (settings.centerPopup) { + ImGui::SetNextWindowPos(ImVec2(w*0.5,h*0.5),ImGuiCond_Always,ImVec2(0.5,0.5)); + } + } +} + void FurnaceGUI::bindEngine(DivEngine* eng) { e=eng; wavePreview.setEngine(e); @@ -2783,6 +2791,7 @@ void FurnaceGUI::editOptions(bool topMenu) { if (ImGui::MenuItem("values up (+16)",BIND_FOR(GUI_ACTION_PAT_VALUE_UP_COARSE))) doTranspose(16,opMaskTransposeValue); if (ImGui::MenuItem("values down (-16)",BIND_FOR(GUI_ACTION_PAT_VALUE_DOWN_COARSE))) doTranspose(-16,opMaskTransposeValue); ImGui::Separator(); + ImGui::AlignTextToFramePadding(); ImGui::Text("transpose"); ImGui::SameLine(); ImGui::SetNextItemWidth(120.0f*dpiScale); @@ -3918,7 +3927,7 @@ bool FurnaceGUI::loop() { if (!mobileUI) { ImGui::BeginMainMenuBar(); - if (ImGui::BeginMenu("file")) { + if (ImGui::BeginMenu(settings.capitalMenuBar?"File":"file")) { if (ImGui::MenuItem("new...",BIND_FOR(GUI_ACTION_NEW))) { if (modified) { showWarning("Unsaved changes! Save changes before creating a new song?",GUI_WARN_NEW); @@ -4013,6 +4022,7 @@ bool FurnaceGUI::loop() { ImGui::Checkbox("loop",&vgmExportLoop); if (vgmExportLoop && e->song.loopModality==2) { ImGui::Text("loop trail:"); + ImGui::Indent(); if (ImGui::RadioButton("auto-detect",vgmExportTrailingTicks==-1)) { vgmExportTrailingTicks=-1; } @@ -4028,6 +4038,7 @@ bool FurnaceGUI::loop() { if (vgmExportTrailingTicks<0) vgmExportTrailingTicks=0; } } + ImGui::Unindent(); } ImGui::Checkbox("add pattern change hints",&vgmExportPatternHints); if (ImGui::IsItemHovered()) { @@ -4116,6 +4127,7 @@ bool FurnaceGUI::loop() { "Furnace Amiga emulator is working properly by\n" "comparing it with real Amiga output." ); + ImGui::AlignTextToFramePadding(); ImGui::Text("Directory"); ImGui::SameLine(); ImGui::InputText("##AVDPath",&workingDirROMExport); @@ -4241,7 +4253,7 @@ bool FurnaceGUI::loop() { } else { exitDisabledTimer=0; } - if (ImGui::BeginMenu("edit")) { + if (ImGui::BeginMenu(settings.capitalMenuBar?"Edit":"edit")) { ImGui::Text("..."); ImGui::Separator(); if (ImGui::MenuItem("undo",BIND_FOR(GUI_ACTION_UNDO))) doUndo(); @@ -4254,7 +4266,7 @@ bool FurnaceGUI::loop() { } ImGui::EndMenu(); } - if (ImGui::BeginMenu("settings")) { + if (ImGui::BeginMenu(settings.capitalMenuBar?"Settings":"settings")) { #ifndef IS_MOBILE if (ImGui::MenuItem("full screen",BIND_FOR(GUI_ACTION_FULLSCREEN),fullScreen)) { doAction(GUI_ACTION_FULLSCREEN); @@ -4290,7 +4302,7 @@ bool FurnaceGUI::loop() { } ImGui::EndMenu(); } - if (ImGui::BeginMenu("window")) { + if (ImGui::BeginMenu(settings.capitalMenuBar?"Window":"window")) { if (ImGui::MenuItem("song information",BIND_FOR(GUI_ACTION_WINDOW_SONG_INFO),songInfoOpen)) songInfoOpen=!songInfoOpen; if (ImGui::MenuItem("subsongs",BIND_FOR(GUI_ACTION_WINDOW_SUBSONGS),subSongsOpen)) subSongsOpen=!subSongsOpen; if (ImGui::MenuItem("speed",BIND_FOR(GUI_ACTION_WINDOW_SPEED),speedOpen)) speedOpen=!speedOpen; @@ -4332,7 +4344,7 @@ bool FurnaceGUI::loop() { ImGui::EndMenu(); } - if (ImGui::BeginMenu("help")) { + if (ImGui::BeginMenu(settings.capitalMenuBar?"Help":"help")) { if (ImGui::MenuItem("effect list",BIND_FOR(GUI_ACTION_WINDOW_EFFECT_LIST),effectListOpen)) effectListOpen=!effectListOpen; if (ImGui::MenuItem("debug menu",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) debugOpen=!debugOpen; if (ImGui::MenuItem("inspector",BIND_FOR(GUI_ACTION_WINDOW_DEBUG))) inspectorOpen=!inspectorOpen; @@ -5233,6 +5245,7 @@ bool FurnaceGUI::loop() { MEASURE_BEGIN(popup); + centerNextWindow("Rendering...",canvasW,canvasH); if (ImGui::BeginPopupModal("Rendering...",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("Please wait..."); if (ImGui::Button("Abort")) { @@ -5260,6 +5273,7 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + centerNextWindow("Error",canvasW,canvasH); if (ImGui::BeginPopupModal("Error",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("%s",errorString.c_str()); if (ImGui::Button("OK")) { @@ -5268,6 +5282,7 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + centerNextWindow("Warning",canvasW,canvasH); if (ImGui::BeginPopupModal("Warning",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("%s",warnString.c_str()); switch (warnAction) { @@ -5626,6 +5641,19 @@ bool FurnaceGUI::loop() { wavePreviewInit=true; updateFMPreview=true; } + + if (settings.blankIns) { + e->song.ins[curIns]->fm.fb=0; + for (int i=0; i<4; i++) { + e->song.ins[curIns]->fm.op[i]=DivInstrumentFM::Operator(); + e->song.ins[curIns]->fm.op[i].ar=31; + e->song.ins[curIns]->fm.op[i].dr=31; + e->song.ins[curIns]->fm.op[i].rr=15; + e->song.ins[curIns]->fm.op[i].tl=127; + e->song.ins[curIns]->fm.op[i].dt=3; + } + } + MARK_MODIFIED; } } @@ -5636,11 +5664,13 @@ bool FurnaceGUI::loop() { // TODO: // - multiple selection // - replace instrument + centerNextWindow("Select Instrument",canvasW,canvasH); if (ImGui::BeginPopupModal("Select Instrument",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { bool quitPlease=false; if (pendingInsSingle) { ImGui::Text("this is an instrument bank! select which one to use:"); } else { + ImGui::AlignTextToFramePadding(); ImGui::Text("this is an instrument bank! select which ones to load:"); ImGui::SameLine(); if (ImGui::Button("All")) { @@ -5713,6 +5743,7 @@ bool FurnaceGUI::loop() { ImGui::EndPopup(); } + centerNextWindow("Import Raw Sample",canvasW,canvasH); if (ImGui::BeginPopupModal("Import Raw Sample",NULL,ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Text("Data type:"); for (int i=0; itype==DIV_INS_C64) if (ImGui::BeginTabItem("C64")) { + ImGui::AlignTextToFramePadding(); ImGui::Text("Waveform"); ImGui::SameLine(); pushToggleColors(ins->c64.triOn); @@ -4348,6 +4349,7 @@ void FurnaceGUI::drawInsEdit() { P(CWSliderScalar("Cutoff",ImGuiDataType_U16,&ins->c64.cut,&_ZERO,&_TWO_THOUSAND_FORTY_SEVEN)); rightClickable P(CWSliderScalar("Resonance",ImGuiDataType_U8,&ins->c64.res,&_ZERO,&_FIFTEEN)); rightClickable + ImGui::AlignTextToFramePadding(); ImGui::Text("Filter Mode"); ImGui::SameLine(); pushToggleColors(ins->c64.lp); @@ -5250,6 +5252,7 @@ void FurnaceGUI::drawInsEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Wave 1"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -5260,6 +5263,7 @@ void FurnaceGUI::drawInsEdit() { } if (isSingleWaveFX) { ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Wave 2"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); diff --git a/src/gui/mixer.cpp b/src/gui/mixer.cpp index ff1641ba0..dfa270ecd 100644 --- a/src/gui/mixer.cpp +++ b/src/gui/mixer.cpp @@ -244,6 +244,7 @@ void FurnaceGUI::drawMixer() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("%d. %s",i+1,getSystemName(e->song.system[i])); ImGui::TableNextColumn(); if (ImGui::Checkbox("Invert",&doInvert)) { diff --git a/src/gui/piano.cpp b/src/gui/piano.cpp index 4842d05cf..3c501c45f 100644 --- a/src/gui/piano.cpp +++ b/src/gui/piano.cpp @@ -100,6 +100,7 @@ void FurnaceGUI::drawPiano() { } if (ImGui::BeginPopupContextItem("PianoOptions",ImGuiPopupFlags_MouseButtonLeft)) { ImGui::Text("Key layout:"); + ImGui::Indent(); if (ImGui::RadioButton("Automatic",pianoView==PIANO_LAYOUT_AUTOMATIC)) { pianoView=PIANO_LAYOUT_AUTOMATIC; } @@ -109,7 +110,9 @@ void FurnaceGUI::drawPiano() { if (ImGui::RadioButton("Continuous",pianoView==PIANO_LAYOUT_CONTINUOUS)) { pianoView=PIANO_LAYOUT_CONTINUOUS; } + ImGui::Unindent(); ImGui::Text("Value input pad:"); + ImGui::Indent(); if (ImGui::RadioButton("Disabled",pianoInputPadMode==PIANO_INPUT_PAD_DISABLE)) { pianoInputPadMode=PIANO_INPUT_PAD_DISABLE; } @@ -122,6 +125,7 @@ void FurnaceGUI::drawPiano() { if (ImGui::RadioButton("Split (always visible)",pianoInputPadMode==PIANO_INPUT_PAD_SPLIT_VISIBLE)) { pianoInputPadMode=PIANO_INPUT_PAD_SPLIT_VISIBLE; } + ImGui::Unindent(); ImGui::Checkbox("Share play/edit offset/range",&pianoSharePosition); ImGui::Checkbox("Read-only (can't input notes)",&pianoReadonly); ImGui::EndPopup(); @@ -377,7 +381,6 @@ void FurnaceGUI::drawPiano() { pianoOptions=!pianoOptions; } - // TODO: wave and sample preview // first check released keys for (int i=0; i<180; i++) { int note=i-60; diff --git a/src/gui/presets.cpp b/src/gui/presets.cpp index 356ac6f6a..d23622ad2 100644 --- a/src/gui/presets.cpp +++ b/src/gui/presets.cpp @@ -1407,28 +1407,40 @@ void FurnaceGUI::initSystemPresets() { "Sega System 32", { CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz } ); ENTRY( "Sega System 32 (extended channel 3 on first OPN2C)", { CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz } ); ENTRY( "Sega System 32 (extended channel 3 on second OPN2C)", { CH(DIV_SYSTEM_YM2612, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz } ); ENTRY( "Sega System 32 (extended channel 3 on both OPN2Cs)", { CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // discrete 8.05MHz YM3438 CH(DIV_SYSTEM_YM2612_EXT, 1.0f, 0, "clockSel=4"), // ^^ - CH(DIV_SYSTEM_RF5C68, 1.0f, 0, "clockSel=2") // 12.5MHz + CH(DIV_SYSTEM_RF5C68, 1.0f, 0, + "clockSel=2\n" + "chipType=1\n" + ) // 12.5MHz } ); ENTRY( diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 99ccbd22c..5cea58f03 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -372,6 +372,7 @@ void FurnaceGUI::drawSampleEdit() { if (sampleInfo) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Type"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -445,6 +446,7 @@ void FurnaceGUI::drawSampleEdit() { bool coarseChanged=false; ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Hz"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -459,6 +461,7 @@ void FurnaceGUI::drawSampleEdit() { } } + ImGui::AlignTextToFramePadding(); ImGui::Text("Note"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -501,6 +504,7 @@ void FurnaceGUI::drawSampleEdit() { } } + ImGui::AlignTextToFramePadding(); ImGui::Text("Fine"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -537,6 +541,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::TableNextColumn(); ImGui::BeginDisabled(!(doLoop || keepLoopAlive)); keepLoopAlive=false; + ImGui::AlignTextToFramePadding(); ImGui::Text("Mode"); ImGui::SameLine(); pushWarningColor(!warnLoopMode.empty()); @@ -560,6 +565,7 @@ void FurnaceGUI::drawSampleEdit() { popWarningColor(); pushWarningColor(!warnLoopPos.empty()); + ImGui::AlignTextToFramePadding(); ImGui::Text("Start"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -585,6 +591,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::SetTooltip("%s",warnLoopPos.c_str()); } + ImGui::AlignTextToFramePadding(); ImGui::Text("End"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -1018,6 +1025,7 @@ void FurnaceGUI::drawSampleEdit() { if (sampleFilterRes<0.0f) sampleFilterRes=0.0f; if (sampleFilterRes>0.99f) sampleFilterRes=0.99f; } + ImGui::AlignTextToFramePadding(); ImGui::Text("Power"); ImGui::SameLine(); if (ImGui::RadioButton("1x",sampleFilterPower==1)) { @@ -1601,7 +1609,7 @@ void FurnaceGUI::drawSampleEdit() { posX=samplePos+pos.x*sampleZoom; if (posX>(int)sample->samples) posX=-1; } - posY=(0.5-pos.y/rectSize.y)*((sample->depth==DIV_SAMPLE_DEPTH_8BIT)?255:32767); + posY=(0.5-pos.y/rectSize.y)*((sample->depth==DIV_SAMPLE_DEPTH_8BIT)?255:65535); if (posX>=0) { statusBar2=fmt::sprintf("(%d, %d)",posX,posY); } diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 564bebada..28635aa4a 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -239,6 +239,7 @@ const char* specificControls[18]={ #define UI_KEYBIND_CONFIG(what) \ ImGui::TableNextRow(); \ ImGui::TableNextColumn(); \ + ImGui::AlignTextToFramePadding();\ ImGui::TextUnformatted(guiActions[what].friendlyName); \ ImGui::TableNextColumn(); \ if (ImGui::Button(fmt::sprintf("%s##KC_" #what,(bindSetPending && bindSetTarget==what)?"Press key...":getKeyName(actionKeys[what])).c_str())) { \ @@ -474,6 +475,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION CHIP CONFIG_SUBSECTION("Chip"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Initial system:"); ImGui::SameLine(); if (ImGui::Button("Current system")) { @@ -552,6 +554,7 @@ void FurnaceGUI::drawSettings() { settings.initialSysName="Sega Genesis/Mega Drive"; } + ImGui::AlignTextToFramePadding(); ImGui::Text("Name"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -720,6 +723,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION OUTPUT CONFIG_SUBSECTION("Output"); #ifdef HAVE_JACK + ImGui::AlignTextToFramePadding(); ImGui::Text("Backend"); ImGui::SameLine(); int prevAudioEngine=settings.audioEngine; @@ -731,6 +735,7 @@ void FurnaceGUI::drawSettings() { #endif if (settings.audioEngine==DIV_AUDIO_SDL) { + ImGui::AlignTextToFramePadding(); ImGui::Text("Driver"); ImGui::SameLine(); if (ImGui::BeginCombo("##SDLADriver",settings.sdlAudioDriver.empty()?"Automatic":settings.sdlAudioDriver.c_str())) { @@ -749,6 +754,7 @@ void FurnaceGUI::drawSettings() { } } + ImGui::AlignTextToFramePadding(); ImGui::Text("Device"); ImGui::SameLine(); String audioDevName=settings.audioDevice.empty()?"":settings.audioDevice; @@ -764,6 +770,7 @@ void FurnaceGUI::drawSettings() { ImGui::EndCombo(); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Sample rate"); ImGui::SameLine(); String sr=fmt::sprintf("%d",settings.audioRate); @@ -788,6 +795,7 @@ void FurnaceGUI::drawSettings() { if (settings.audioChans>16) settings.audioChans=16; } } else { + ImGui::AlignTextToFramePadding(); ImGui::Text("Channels"); ImGui::SameLine(); String chStr=(settings.audioChans<1 || settings.audioChans>8)?"What?":nonProAudioOuts[settings.audioChans-1]; @@ -801,6 +809,7 @@ void FurnaceGUI::drawSettings() { } } + ImGui::AlignTextToFramePadding(); ImGui::Text("Buffer size"); ImGui::SameLine(); String bs=fmt::sprintf("%d (latency: ~%.1fms)",settings.audioBufSize,2000.0*(double)settings.audioBufSize/(double)MAX(1,settings.audioRate)); @@ -835,6 +844,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION MIXING CONFIG_SUBSECTION("Mixing"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Quality"); ImGui::SameLine(); ImGui::Combo("##Quality",&settings.audioQuality,audioQualities,2); @@ -846,6 +856,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION METRONOME CONFIG_SUBSECTION("Metronome"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Metronome volume"); ImGui::SameLine(); if (ImGui::SliderInt("##MetroVol",&settings.metroVol,0,200,"%d%%")) { @@ -859,6 +870,7 @@ void FurnaceGUI::drawSettings() { CONFIG_SECTION("MIDI") { // SUBSECTION MIDI INPUT CONFIG_SUBSECTION("MIDI input"); + ImGui::AlignTextToFramePadding(); ImGui::Text("MIDI input"); ImGui::SameLine(); String midiInName=settings.midiInDevice.empty()?"":settings.midiInDevice; @@ -947,6 +959,7 @@ void FurnaceGUI::drawSettings() { } ImGui::PlotLines("##VolCurveDisplay",curve,128,0,"Volume curve",0.0,127.0,ImVec2(200.0f*dpiScale,200.0f*dpiScale)); + ImGui::AlignTextToFramePadding(); ImGui::Text("Actions:"); ImGui::SameLine(); if (ImGui::Button(ICON_FA_PLUS "##AddAction")) { @@ -1109,6 +1122,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION MIDI OUTPUT CONFIG_SUBSECTION("MIDI output"); + ImGui::AlignTextToFramePadding(); ImGui::Text("MIDI output"); ImGui::SameLine(); String midiOutName=settings.midiOutDevice.empty()?"":settings.midiOutDevice; @@ -1179,40 +1193,49 @@ void FurnaceGUI::drawSettings() { CONFIG_SECTION("Emulation") { // SUBSECTION LAYOUT CONFIG_SUBSECTION("Cores"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Arcade/YM2151 core"); ImGui::SameLine(); ImGui::Combo("##ArcadeCore",&settings.arcadeCore,arcadeCores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("Genesis/YM2612 core"); ImGui::SameLine(); ImGui::Combo("##YM2612Core",&settings.ym2612Core,ym2612Cores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("SN76489 core"); ImGui::SameLine(); ImGui::Combo("##SNCore",&settings.snCore,snCores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("NES core"); ImGui::SameLine(); ImGui::Combo("##NESCore",&settings.nesCore,nesCores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("FDS core"); ImGui::SameLine(); ImGui::Combo("##FDSCore",&settings.fdsCore,nesCores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("SID core"); ImGui::SameLine(); ImGui::Combo("##C64Core",&settings.c64Core,c64Cores,3); + ImGui::AlignTextToFramePadding(); ImGui::Text("POKEY core"); ImGui::SameLine(); ImGui::Combo("##POKEYCore",&settings.pokeyCore,pokeyCores,2); + ImGui::AlignTextToFramePadding(); ImGui::Text("OPN/OPNA/OPNB cores"); ImGui::SameLine(); ImGui::Combo("##OPNCore",&settings.opnCore,opnCores,2); ImGui::Separator(); + ImGui::AlignTextToFramePadding(); ImGui::Text("PC Speaker strategy"); ImGui::SameLine(); ImGui::Combo("##PCSOutMethod",&settings.pcSpeakerOutMethod,pcspkrOutMethods,5); @@ -1220,6 +1243,7 @@ void FurnaceGUI::drawSettings() { ImGui::Separator(); ImGui::Text("Sample ROMs:"); + ImGui::AlignTextToFramePadding(); ImGui::Text("OPL4 YRW801 path"); ImGui::SameLine(); ImGui::InputText("##YRW801Path",&settings.yrw801Path); @@ -1228,6 +1252,7 @@ void FurnaceGUI::drawSettings() { openFileDialog(GUI_FILE_YRW801_ROM_OPEN); } + ImGui::AlignTextToFramePadding(); ImGui::Text("MultiPCM TG100 path"); ImGui::SameLine(); ImGui::InputText("##TG100Path",&settings.tg100Path); @@ -1236,6 +1261,7 @@ void FurnaceGUI::drawSettings() { openFileDialog(GUI_FILE_TG100_ROM_OPEN); } + ImGui::AlignTextToFramePadding(); ImGui::Text("MultiPCM MU5 path"); ImGui::SameLine(); ImGui::InputText("##MU5Path",&settings.mu5Path); @@ -1478,6 +1504,7 @@ void FurnaceGUI::drawSettings() { UI_KEYBIND_CONFIG(GUI_ACTION_PAT_COLLAPSE_SONG); UI_KEYBIND_CONFIG(GUI_ACTION_PAT_EXPAND_SONG); UI_KEYBIND_CONFIG(GUI_ACTION_PAT_LATCH); + UI_KEYBIND_CONFIG(GUI_ACTION_PAT_CLEAR_LATCH); KEYBIND_CONFIG_END; ImGui::TreePop(); @@ -1604,6 +1631,7 @@ void FurnaceGUI::drawSettings() { CONFIG_SECTION("Interface") { // SUBSECTION LAYOUT CONFIG_SUBSECTION("Layout"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Workspace layout:"); ImGui::SameLine(); if (ImGui::Button("Import")) { @@ -1639,6 +1667,11 @@ void FurnaceGUI::drawSettings() { applyUISettings(false); } + bool centerPopupB=settings.centerPopup; + if (ImGui::Checkbox("Center pop-up windows",¢erPopupB)) { + settings.centerPopup=centerPopupB; + } + ImGui::Text("Play/edit controls layout:"); ImGui::Indent(); if (ImGui::RadioButton("Classic##ecl0",settings.controlLayout==0)) { @@ -1908,6 +1941,7 @@ void FurnaceGUI::drawSettings() { // SUBSECTION TEXT CONFIG_SUBSECTION("Text"); + ImGui::AlignTextToFramePadding(); ImGui::Text("Main font"); ImGui::SameLine(); ImGui::Combo("##MainFont",&settings.mainFont,mainFonts,7); @@ -1924,6 +1958,7 @@ void FurnaceGUI::drawSettings() { if (settings.mainFontSize>96) settings.mainFontSize=96; } ImGui::Unindent(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Header font"); ImGui::SameLine(); ImGui::Combo("##HeadFont",&settings.headFont,headFonts,7); @@ -1940,6 +1975,7 @@ void FurnaceGUI::drawSettings() { if (settings.headFontSize>96) settings.headFontSize=96; } ImGui::Unindent(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Pattern font"); ImGui::SameLine(); ImGui::Combo("##PatFont",&settings.patFont,patFonts,7); @@ -2059,6 +2095,11 @@ void FurnaceGUI::drawSettings() { } ImGui::Unindent(); + bool capitalMenuBarB=settings.capitalMenuBar; + if (ImGui::Checkbox("Capitalize menu bar",&capitalMenuBarB)) { + settings.capitalMenuBar=capitalMenuBarB; + } + // SUBSECTION ORDERS CONFIG_SUBSECTION("Orders"); // sorry. temporarily disabled until ImGui has a way to add separators in tables arbitrarily. @@ -2281,6 +2322,11 @@ void FurnaceGUI::drawSettings() { settings.insEditColorize=insEditColorizeB; } + bool insTypeMenuB=settings.insTypeMenu; + if (ImGui::Checkbox("Display instrument type menu when adding instrument",&insTypeMenuB)) { + settings.insTypeMenu=insTypeMenuB; + } + // SUBSECTION MACRO EDITOR CONFIG_SUBSECTION("Macro Editor"); ImGui::Text("Macro editor layout:"); @@ -3017,6 +3063,9 @@ void FurnaceGUI::syncSettings() { settings.removeInsOff=e->getConfInt("removeInsOff",0); settings.removeVolOff=e->getConfInt("removeVolOff",0); settings.playOnLoad=e->getConfInt("playOnLoad",0); + settings.insTypeMenu=e->getConfInt("insTypeMenu",1); + settings.capitalMenuBar=e->getConfInt("capitalMenuBar",0); + settings.centerPopup=e->getConfInt("centerPopup",1); clampSetting(settings.mainFontSize,2,96); clampSetting(settings.headFontSize,2,96); @@ -3151,6 +3200,9 @@ void FurnaceGUI::syncSettings() { clampSetting(settings.removeInsOff,0,1); clampSetting(settings.removeVolOff,0,1); clampSetting(settings.playOnLoad,0,2); + clampSetting(settings.insTypeMenu,0,1); + clampSetting(settings.capitalMenuBar,0,1); + clampSetting(settings.centerPopup,0,1); if (settings.exportLoops<0.0) settings.exportLoops=0.0; if (settings.exportFadeOut<0.0) settings.exportFadeOut=0.0; @@ -3385,6 +3437,9 @@ void FurnaceGUI::commitSettings() { e->setConf("removeInsOff",settings.removeInsOff); e->setConf("removeVolOff",settings.removeVolOff); e->setConf("playOnLoad",settings.playOnLoad); + e->setConf("insTypeMenu",settings.insTypeMenu); + e->setConf("capitalMenuBar",settings.capitalMenuBar); + e->setConf("centerPopup",settings.centerPopup); // colors for (int i=0; iEllipsisCharCount=3; } - // TODO: allow changing these colors. ImGuiFileDialog::Instance()->SetFileStyle(IGFD_FileStyleByTypeDir,"",uiColors[GUI_COLOR_FILE_DIR],ICON_FA_FOLDER_O); ImGuiFileDialog::Instance()->SetFileStyle(IGFD_FileStyleByTypeFile,"",uiColors[GUI_COLOR_FILE_OTHER],ICON_FA_FILE_O); ImGuiFileDialog::Instance()->SetFileStyle(IGFD_FileStyleByExtension,".fur",uiColors[GUI_COLOR_FILE_SONG_NATIVE],ICON_FA_FILE); diff --git a/src/gui/songInfo.cpp b/src/gui/songInfo.cpp index 65803e577..b1c4895a0 100644 --- a/src/gui/songInfo.cpp +++ b/src/gui/songInfo.cpp @@ -36,6 +36,7 @@ void FurnaceGUI::drawSongInfo(bool asChild) { ImGui::TableSetupColumn("c1",ImGuiTableColumnFlags_WidthStretch,0.0); ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Name"); ImGui::TableNextColumn(); float avail=ImGui::GetContentRegionAvail().x; @@ -59,6 +60,7 @@ void FurnaceGUI::drawSongInfo(bool asChild) { } ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Author"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(avail); @@ -68,6 +70,7 @@ void FurnaceGUI::drawSongInfo(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Album"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(avail); @@ -77,6 +80,7 @@ void FurnaceGUI::drawSongInfo(bool asChild) { if (!basicMode) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("System"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(MAX(16.0f*dpiScale,avail-autoButtonSize-ImGui::GetStyle().ItemSpacing.x)); @@ -112,6 +116,7 @@ void FurnaceGUI::drawSongInfo(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Tuning (A-4)"); ImGui::TableNextColumn(); float tune=e->song.tuning; diff --git a/src/gui/speed.cpp b/src/gui/speed.cpp index 5557c663e..593467852 100644 --- a/src/gui/speed.cpp +++ b/src/gui/speed.cpp @@ -37,6 +37,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); if (ImGui::SmallButton(tempoView?"Base Tempo##TempoOrHz":"Tick Rate##TempoOrHz")) { tempoView=!tempoView; } @@ -74,6 +75,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); if (keepGrooveAlive || e->curSubSong->speeds.len>2) { if (ImGui::SmallButton("Groove")) { e->lockEngine([this]() { @@ -163,6 +165,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { if (!basicMode) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Virtual Tempo"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(halfAvail); @@ -185,6 +188,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Divider"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(halfAvail); @@ -200,6 +204,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Highlight"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(halfAvail); @@ -222,6 +227,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { ImGui::TableSetupColumn("c2",ImGuiTableColumnFlags_WidthStretch,0.0); ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Pattern Length"); ImGui::TableNextColumn(); float avail=ImGui::GetContentRegionAvail().x; @@ -236,6 +242,7 @@ void FurnaceGUI::drawSpeed(bool asChild) { if (!basicMode) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Song Length"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(avail); diff --git a/src/gui/stats.cpp b/src/gui/stats.cpp index ed879ff2a..5bc2ee102 100644 --- a/src/gui/stats.cpp +++ b/src/gui/stats.cpp @@ -32,6 +32,7 @@ void FurnaceGUI::drawStats() { size_t lastProcTime=e->processTime; double maxGot=1000000000.0*(double)e->getAudioDescGot().bufsize/(double)e->getAudioDescGot().rate; String procStr=fmt::sprintf("%.1f%%",100.0*((double)lastProcTime/(double)maxGot)); + ImGui::AlignTextToFramePadding(); ImGui::Text("Audio load"); ImGui::SameLine(); ImGui::ProgressBar((double)lastProcTime/maxGot,ImVec2(-FLT_MIN,0),procStr.c_str()); @@ -47,6 +48,7 @@ void FurnaceGUI::drawStats() { } else { usageStr=fmt::sprintf("%d/%d",usage,capacity); } + ImGui::AlignTextToFramePadding(); ImGui::Text("%s [%d]", e->getSystemName(e->song.system[i]), j); ImGui::SameLine(); ImGui::ProgressBar(((float)usage)/((float)capacity),ImVec2(-FLT_MIN,0),usageStr.c_str()); diff --git a/src/gui/subSongs.cpp b/src/gui/subSongs.cpp index 5d34c23fd..15b107ed0 100644 --- a/src/gui/subSongs.cpp +++ b/src/gui/subSongs.cpp @@ -127,6 +127,7 @@ void FurnaceGUI::drawSubSongs(bool asChild) { ImGui::SetTooltip("Remove"); } + ImGui::AlignTextToFramePadding(); ImGui::Text("Name"); ImGui::SameLine(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); diff --git a/src/gui/sysConf.cpp b/src/gui/sysConf.cpp index 2f80a8b93..cc95e4099 100644 --- a/src/gui/sysConf.cpp +++ b/src/gui/sysConf.cpp @@ -395,6 +395,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo int clockSel=flags.getInt("clockSel",0); int patchSet=flags.getInt("patchSet",0); bool noTopHatFreq=flags.getBool("noTopHatFreq",false); + bool fixedAll=flags.getBool("fixedAll",false); ImGui::Text("Clock rate:"); ImGui::Indent(); @@ -441,6 +442,9 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo if (ImGui::Checkbox("Ignore top/hi-hat frequency changes",&noTopHatFreq)) { altered=true; } + if (ImGui::Checkbox("Apply fixed frequency to all drums at once",&fixedAll)) { + altered=true; + } } if (altered) { @@ -450,6 +454,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo flags.set("patchSet",patchSet); } flags.set("noTopHatFreq",noTopHatFreq); + flags.set("fixedAll",fixedAll); }); } break; @@ -1602,7 +1607,7 @@ bool FurnaceGUI::drawSysConf(int chan, DivSystem type, DivConfig& flags, bool mo } break; } - case DIV_SYSTEM_SNES: { // TODO: echo + case DIV_SYSTEM_SNES: { char temp[64]; int vsL=127-(flags.getInt("volScaleL",0)&127); int vsR=127-(flags.getInt("volScaleR",0)&127); diff --git a/src/gui/sysEx.cpp b/src/gui/sysEx.cpp index 5a72649ee..aa86363f8 100644 --- a/src/gui/sysEx.cpp +++ b/src/gui/sysEx.cpp @@ -60,8 +60,7 @@ bool FurnaceGUI::parseSysEx(unsigned char* data, size_t len) { op.rs=reader.readC(); reader.readC(); // EBS - ignore op.am=reader.readC(); - // TODO: don't ignore after I add KVS to Furnace - reader.readC(); // KVS - ignore + op.kvs=(reader.readC()>2)?1:0; op.tl=3+((99-reader.readC())*124)/99; unsigned char freq=reader.readC(); logV("OP%d freq: %d",i,freq); diff --git a/src/gui/waveEdit.cpp b/src/gui/waveEdit.cpp index dce89bc96..3905b7614 100644 --- a/src/gui/waveEdit.cpp +++ b/src/gui/waveEdit.cpp @@ -593,6 +593,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Duty"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -602,6 +603,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("Exponent"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -611,6 +613,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("XOR Point"); ImGui::TableNextColumn(); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); @@ -630,6 +633,7 @@ void FurnaceGUI::drawWaveEdit() { for (int i=0; i<16; i++) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("%d",i+1); ImGui::TableNextColumn(); ImGui::PushID(140+i); @@ -683,6 +687,7 @@ void FurnaceGUI::drawWaveEdit() { for (int i=0; i<4; i++) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("%d",i+1); ImGui::TableNextColumn(); @@ -727,6 +732,7 @@ void FurnaceGUI::drawWaveEdit() { for (int i=0; i<4; i++) { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("%d",i+1); ImGui::TableNextColumn(); @@ -760,6 +766,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("1"); ImGui::TableNextColumn(); if (ImGui::Checkbox("##ConO1",&waveGenFMCon0[0])) { @@ -784,6 +791,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("2"); ImGui::TableNextColumn(); if (ImGui::Checkbox("##Con11",&waveGenFMCon1[0])) { @@ -808,6 +816,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("3"); ImGui::TableNextColumn(); if (ImGui::Checkbox("##Con21",&waveGenFMCon2[0])) { @@ -832,6 +841,7 @@ void FurnaceGUI::drawWaveEdit() { ImGui::TableNextRow(); ImGui::TableNextColumn(); + ImGui::AlignTextToFramePadding(); ImGui::Text("4"); ImGui::TableNextColumn(); if (ImGui::Checkbox("##Con31",&waveGenFMCon3[0])) {