This commit is contained in:
2024-06-01 17:09:23 +03:00
parent 4c7c2e863b
commit 8c1fe50342
13 changed files with 1977 additions and 424 deletions

2
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,2 @@
{
}

View File

@ -1,16 +1,16 @@
// some useful song defines for 4klang
#define SAMPLE_RATE 44100
#define BPM 145.000000
#define MAX_INSTRUMENTS 5
#define MAX_PATTERNS 72
#define PATTERN_SIZE_SHIFT 4
#define BPM 165.000000
#define MAX_INSTRUMENTS 6
#define MAX_PATTERNS 25
#define PATTERN_SIZE_SHIFT 5
#define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)
#define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)
#define SAMPLES_PER_TICK 4562
#define SAMPLES_PER_TICK 4009
#define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)
#define POLYPHONY 1
#define INTEGER_16BIT
#define SAMPLE_TYPE short
#define FLOAT_32BIT
#define SAMPLE_TYPE float
#define WINDOWS_OBJECT

View File

@ -4,27 +4,27 @@
%endmacro
%define USE_SECTIONS
%define SAMPLE_RATE 44100
%define MAX_INSTRUMENTS 5
%define MAX_INSTRUMENTS 6
%define MAX_VOICES 1
%define HLD 1
%define BPM 145.000000
%define MAX_PATTERNS 72
%define PATTERN_SIZE_SHIFT 4
%define BPM 165.000000
%define MAX_PATTERNS 25
%define PATTERN_SIZE_SHIFT 5
%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)
%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)
%define SAMPLES_PER_TICK 4562
%define DEF_LFO_NORMALIZE 0.0000547997
%define SAMPLES_PER_TICK 4009
%define DEF_LFO_NORMALIZE 0.0000623583
%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)
%define GO4K_USE_16BIT_OUTPUT
;%define GO4K_USE_16BIT_OUTPUT
;%define GO4K_USE_GROOVE_PATTERN
;%define GO4K_USE_ENVELOPE_RECORDINGS
;%define GO4K_USE_NOTE_RECORDINGS
%define GO4K_CLIP_OUTPUT
%define GO4K_USE_DST
%define GO4K_USE_DLL
%define GO4K_USE_PAN
%define GO4K_USE_GLOBAL_DLL
%define GO4K_USE_ENV_CHECK
%define GO4K_USE_ENV_MOD_GM
%define GO4K_USE_VCO_CHECK
%define GO4K_USE_VCO_PHASE_OFFSET
%define GO4K_USE_VCO_SHAPE
@ -32,12 +32,14 @@
%define GO4K_USE_VCO_MOD_DM
%define GO4K_USE_VCO_MOD_CM
%define GO4K_USE_VCF_CHECK
%define GO4K_USE_VCF_MOD_FM
%define GO4K_USE_VCF_HIGH
%define GO4K_USE_VCF_BAND
%define GO4K_USE_VCF_PEAK
%define GO4K_USE_VCF_STEREO
%define GO4K_USE_DST_CHECK
%define GO4K_USE_DST_SH
%define GO4K_USE_DLL_CHORUS
%define GO4K_USE_DLL_CHORUS_CLAMP
%define GO4K_USE_DLL_DAMP
%define GO4K_USE_DLL_DC_FILTER
@ -450,56 +452,33 @@ section .g4kmuc1 data align=1
section .data align=1
%endif
go4k_patterns
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
db 39, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 44, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 39, HLD, 0, 0, 39, HLD, HLD, HLD, HLD, HLD, HLD, 0, 39, 0, 39, HLD,
db 0, 0, 39, 0, 39, HLD, HLD, HLD, 39, 0, 39, 0, 50, HLD, 51, HLD,
db 48, HLD, 0, 0, 48, HLD, HLD, HLD, HLD, HLD, 0, 0, 48, 0, 48, HLD,
db 0, 0, 46, 0, 46, HLD, HLD, HLD, HLD, 0, 46, 0, 58, 0, 46, HLD,
db 44, HLD, 0, 0, 44, HLD, HLD, HLD, HLD, HLD, 0, 0, 44, 0, 44, HLD,
db 0, 0, 44, 0, 44, HLD, HLD, HLD, 0, 0, 44, 0, 44, HLD, HLD, HLD,
db 0, 0, 46, 0, 46, HLD, HLD, HLD, 0, 0, 46, 0, 46, HLD, HLD, HLD,
db 48, HLD, 0, 0, 48, HLD, HLD, HLD, HLD, HLD, 0, 0, 48, 0, 46, HLD,
db 0, 0, 43, 0, 43, HLD, HLD, HLD, 0, 0, 43, 0, 43, HLD, HLD, HLD,
db 51, HLD, 0, 0, 51, HLD, HLD, HLD, HLD, HLD, 0, 0, 51, 0, 51, HLD,
db 0, 0, 51, 0, 51, HLD, HLD, HLD, 0, 0, 51, 0, 51, HLD, HLD, HLD,
db 39, HLD, 0, 0, 39, HLD, HLD, HLD, HLD, HLD, 0, 0, 39, 0, 39, HLD,
db 0, 0, 39, 0, 39, HLD, HLD, HLD, 0, 0, 39, 0, 39, HLD, HLD, HLD,
db 63, HLD, 70, HLD, 79, HLD, 63, HLD, 70, HLD, 77, HLD, 63, HLD, 70, HLD,
db 80, HLD, 63, HLD, 70, HLD, 79, HLD, 63, HLD, 70, HLD, 77, HLD, 79, HLD,
db 80, HLD, 63, HLD, 70, HLD, 79, HLD, 63, HLD, 70, HLD, 79, HLD, 77, HLD,
db 80, HLD, 63, HLD, 70, HLD, 75, HLD, 63, HLD, 70, HLD, 75, HLD, 79, HLD,
db 82, HLD, 62, HLD, 70, HLD, 77, HLD, 62, HLD, 70, HLD, 77, HLD, 82, HLD,
db 79, HLD, 63, HLD, 70, HLD, 75, HLD, 63, HLD, 70, HLD, 75, HLD, 79, HLD,
db 74, HLD, 62, HLD, 70, HLD, 74, HLD, 62, HLD, 70, HLD, 74, HLD, 79, HLD,
db 75, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 55, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 55, HLD, 55, HLD, HLD, HLD, 55, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0,
db 0, 0, 0, 0, 0, 0, 0, 0, 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 79, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 70, HLD, HLD, HLD,
db 80, HLD, HLD, HLD, 79, HLD, 77, HLD, HLD, HLD, 79, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 70, HLD, HLD, HLD,
db 80, HLD, 79, HLD, HLD, HLD, 77, HLD, HLD, HLD, 77, HLD, 75, HLD, HLD, HLD,
db 74, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0,
db 80, HLD, 79, HLD, HLD, HLD, 77, HLD, HLD, HLD, 79, 77, 75, HLD, HLD, HLD,
db 77, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 75, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 77, HLD, 79, HLD,
db 77, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 79, HLD, 80, HLD,
db 79, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 77, HLD, 75, HLD, 74, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 70, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 74, HLD, 75, HLD, 77, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 79, HLD, 80, HLD,
db 82, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 80, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 79, HLD, 77, HLD, 77, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 79, HLD, 77, HLD,
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, HLD, HLD, HLD, 57, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, 57, 57, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, 57, 57, HLD, HLD, 57, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0,
db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, HLD, HLD, HLD, 46, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, 46, HLD, HLD, HLD, HLD, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, 46, 46, HLD, HLD, HLD, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, HLD, HLD, HLD, HLD,
db 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
db 50, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, 50, HLD, 53, HLD,
db 43, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 43, HLD, 45, HLD, 46, HLD, 48, HLD,
db 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, 50, HLD,
db 52, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 45, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0,
db 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
db 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
db 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD,
db 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD,
db 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD,
db 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD,
db 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, 0,
go4k_patterns_end
%ifdef USE_SECTIONS
section .g4kmuc2 data align=1
@ -507,11 +486,12 @@ section .g4kmuc2 data align=1
section .data
%endif
go4k_pattern_lists
Instrument0List db 1, 2, 1, 2, 3, 4, 5, 2, 6, 7, 6, 7, 8, 9, 10, 11, 6, 7, 6, 7, 8, 9, 10, 11, 10, 12, 13, 14, 10, 12, 15, 16, 10, 12, 13, 14, 10, 12, 15, 16, 17, 18, 17, 18, 6, 7, 6, 7, 8, 9, 10, 11, 6, 7, 6, 7, 8, 9, 10, 11, 17, 18, 17, 18, 17, 18, 17, 18, 1, 0, 0, 0,
Instrument1List db 19, 20, 19, 21, 19, 21, 19, 20, 19, 20, 19, 21, 19, 21, 19, 20, 19, 20, 19, 21, 19, 21, 19, 20, 22, 23, 24, 25, 22, 23, 24, 24, 22, 23, 24, 25, 22, 23, 24, 24, 19, 20, 19, 21, 19, 20, 19, 21, 19, 21, 19, 20, 19, 20, 19, 21, 19, 21, 19, 20, 19, 20, 19, 21, 19, 20, 19, 21, 26, 0, 0, 0,
Instrument2List db 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 27, 28, 2, 2, 2, 29,
Instrument3List db 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 2, 29,
Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 35, 26, 36, 37, 38, 32, 33, 34, 39, 26, 40, 26, 38, 41, 42, 43, 44, 45, 46, 47, 38, 48, 46, 43, 44, 45, 49, 26, 38, 0, 0, 0, 0, 32, 33, 34, 35, 26, 36, 37, 38, 32, 33, 34, 35, 26, 36, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument0List db 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 2, 4, 2, 2, 2, 5, 2, 3, 2, 4, 2, 2, 2, 5, 6,
Instrument1List db 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 8, 10, 8, 9, 8, 11, 8, 9, 8, 10, 8, 9, 8, 11, 6,
Instrument2List db 0, 0, 0, 0, 0, 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6,
Instrument3List db 13, 14, 15, 16, 17, 18, 13, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument4List db 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 20, 21, 0,
Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, 24, 25, 22, 23, 24, 25, 22, 23, 24, 25, 22, 23, 24, 26, 0,
go4k_pattern_lists_end
%ifdef USE_SECTIONS
section .g4kmuc3 data align=1
@ -522,98 +502,118 @@ go4k_synth_instructions
GO4K_BEGIN_CMDDEF(Instrument0)
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_DST_ID
db GO4K_FOP_ID
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_DST_ID
db GO4K_PAN_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_OUT_ID
db GO4K_ENV_ID
db GO4K_FST_ID
db GO4K_ENV_ID
db GO4K_FST_ID
db GO4K_ENV_ID
db GO4K_FST_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Instrument1)
db GO4K_ENV_ID
db GO4K_FST_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_DST_ID
db GO4K_FOP_ID
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_PAN_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_OUT_ID
db GO4K_ENV_ID
db GO4K_ENV_ID
db GO4K_FOP_ID
db GO4K_FST_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Instrument2)
db GO4K_ENV_ID
db GO4K_FST_ID
db GO4K_ENV_ID
db GO4K_DST_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_PAN_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_DLL_ID
db GO4K_OUT_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Instrument3)
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_ENV_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_VCF_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_VCF_ID
db GO4K_FOP_ID
db GO4K_PAN_ID
db GO4K_OUT_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Instrument4)
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_FOP_ID
db GO4K_FOP_ID
db GO4K_PAN_ID
db GO4K_DLL_ID
db GO4K_FOP_ID
db GO4K_DLL_ID
db GO4K_OUT_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Instrument5)
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FST_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_VCO_ID
db GO4K_ENV_ID
db GO4K_VCO_ID
db GO4K_FOP_ID
db GO4K_VCO_ID
db GO4K_FOP_ID
db GO4K_VCF_ID
db GO4K_FOP_ID
db GO4K_DLL_ID
db GO4K_VCF_ID
db GO4K_PAN_ID
db GO4K_DLL_ID
db GO4K_OUT_ID
GO4K_END_CMDDEF
GO4K_BEGIN_CMDDEF(Global)
@ -634,7 +634,75 @@ section .data
%endif
go4k_synth_parameter_values
GO4K_BEGIN_PARAMDEF(Instrument0)
GO4K_ENV ATTAC(9),DECAY(85),SUSTAIN(113),RELEASE(38),GAIN(106)
GO4K_ENV ATTAC(22),DECAY(64),SUSTAIN(0),RELEASE(0),GAIN(38)
GO4K_VCO TRANSPOSE(77),DETUNE(64),PHASE(19),GATES(0),COLOR(128),SHAPE(66),GAIN(70),FLAGS(SINE)
GO4K_DST DRIVE(78), SNHFREQ(128), FLAGS(0)
GO4K_FOP OP(FOP_MULP)
GO4K_ENV ATTAC(0),DECAY(68),SUSTAIN(0),RELEASE(0),GAIN(70)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(2),GAIN(128),FLAGS(NOISE)
GO4K_FOP OP(FOP_MULP)
GO4K_VCF FREQUENCY(97),RESONANCE(128),VCFTYPE(PEAK)
GO4K_VCF FREQUENCY(108),RESONANCE(128),VCFTYPE(PEAK)
GO4K_FOP OP(FOP_ADDP)
GO4K_VCF FREQUENCY(100),RESONANCE(128),VCFTYPE(PEAK)
GO4K_VCF FREQUENCY(19),RESONANCE(98),VCFTYPE(HIGHPASS)
GO4K_VCF FREQUENCY(15),RESONANCE(128),VCFTYPE(BANDSTOP)
GO4K_VCF FREQUENCY(40),RESONANCE(74),VCFTYPE(BANDSTOP)
GO4K_VCF FREQUENCY(23),RESONANCE(42),VCFTYPE(HIGHPASS)
GO4K_DST DRIVE(97), SNHFREQ(128), FLAGS(0)
GO4K_PAN PANNING(59)
GO4K_DLL PREGAIN(27),DRY(128),FEEDBACK(112),DAMP(0),FREQUENCY(7),DEPTH(70),DELAY(1),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_DLL PREGAIN(27),DRY(128),FEEDBACK(112),DAMP(0),FREQUENCY(16),DEPTH(55),DELAY(9),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_OUT GAIN(128), AUXSEND(0)
GO4K_ENV ATTAC(38),DECAY(49),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_FST AMOUNT(70),DEST(1*MAX_UNIT_SLOTS+1+FST_SET+FST_POP)
GO4K_ENV ATTAC(47),DECAY(54),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_FST AMOUNT(19),DEST(7*MAX_UNIT_SLOTS+4+FST_SET+FST_POP)
GO4K_ENV ATTAC(54),DECAY(68),SUSTAIN(70),RELEASE(0),GAIN(128)
GO4K_FST AMOUNT(26),DEST(10*MAX_UNIT_SLOTS+4+FST_SET+FST_POP)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument1)
GO4K_ENV ATTAC(7),DECAY(73),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_VCO TRANSPOSE(90),DETUNE(0),PHASE(10),GATES(0),COLOR(63),SHAPE(94),GAIN(128),FLAGS(TRISAW)
GO4K_DST DRIVE(58), SNHFREQ(100), FLAGS(0)
GO4K_FOP OP(FOP_ADDP)
GO4K_ENV ATTAC(28),DECAY(45),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(99),GAIN(128),FLAGS(NOISE)
GO4K_VCF FREQUENCY(80),RESONANCE(128),VCFTYPE(PEAK)
GO4K_VCF FREQUENCY(75),RESONANCE(87),VCFTYPE(LOWPASS)
GO4K_FOP OP(FOP_MULP)
GO4K_FOP OP(FOP_ADDP)
GO4K_VCF FREQUENCY(11),RESONANCE(128),VCFTYPE(PEAK)
GO4K_VCF FREQUENCY(53),RESONANCE(128),VCFTYPE(BANDSTOP)
GO4K_VCF FREQUENCY(12),RESONANCE(76),VCFTYPE(HIGHPASS)
GO4K_VCF FREQUENCY(11),RESONANCE(70),VCFTYPE(HIGHPASS)
GO4K_PAN PANNING(64)
GO4K_DLL PREGAIN(21),DRY(128),FEEDBACK(20),DAMP(128),FREQUENCY(6),DEPTH(51),DELAY(9),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_DLL PREGAIN(20),DRY(128),FEEDBACK(20),DAMP(128),FREQUENCY(2),DEPTH(63),DELAY(1),COUNT(8)
GO4K_OUT GAIN(128), AUXSEND(0)
GO4K_ENV ATTAC(75),DECAY(128),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_ENV ATTAC(49),DECAY(71),SUSTAIN(121),RELEASE(0),GAIN(128)
GO4K_FOP OP(FOP_MULP)
GO4K_FST AMOUNT(0),DEST(1*MAX_UNIT_SLOTS+1+FST_SET+FST_POP)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument2)
GO4K_ENV ATTAC(4),DECAY(53),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(102),GAIN(128),FLAGS(NOISE)
GO4K_FOP OP(FOP_MULP)
GO4K_VCF FREQUENCY(87),RESONANCE(128),VCFTYPE(HIGHPASS)
GO4K_VCF FREQUENCY(95),RESONANCE(128),VCFTYPE(BANDSTOP)
GO4K_VCF FREQUENCY(89),RESONANCE(71),VCFTYPE(BANDPASS)
GO4K_PAN PANNING(61)
GO4K_DLL PREGAIN(28),DRY(128),FEEDBACK(50),DAMP(29),FREQUENCY(0),DEPTH(0),DELAY(1),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_DLL PREGAIN(32),DRY(128),FEEDBACK(40),DAMP(0),FREQUENCY(10),DEPTH(34),DELAY(9),COUNT(8)
GO4K_OUT GAIN(45), AUXSEND(0)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument3)
GO4K_ENV ATTAC(23),DECAY(85),SUSTAIN(113),RELEASE(38),GAIN(119)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO)
GO4K_FST AMOUNT(52),DEST(11*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FOP OP(FOP_POP)
@ -650,95 +718,47 @@ GO4K_BEGIN_PARAMDEF(Instrument0)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(106),GAIN(128),FLAGS(SINE)
GO4K_FOP OP(FOP_ADDP)
GO4K_FOP OP(FOP_ADDP)
GO4K_VCF FREQUENCY(128),RESONANCE(89),VCFTYPE(LOWPASS|STEREO)
GO4K_VCF FREQUENCY(54),RESONANCE(120),VCFTYPE(LOWPASS|STEREO)
GO4K_VCF FREQUENCY(35),RESONANCE(70),VCFTYPE(BANDSTOP)
GO4K_FOP OP(FOP_MULP)
GO4K_PAN PANNING(64)
GO4K_OUT GAIN(120), AUXSEND(80)
GO4K_PAN PANNING(63)
GO4K_OUT GAIN(71), AUXSEND(45)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument1)
GO4K_ENV ATTAC(0),DECAY(128),SUSTAIN(128),RELEASE(38),GAIN(78)
GO4K_FST AMOUNT(68),DEST(0*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_VCO TRANSPOSE(64),DETUNE(59),PHASE(0),GATES(85),COLOR(52),SHAPE(64),GAIN(128),FLAGS(PULSE)
GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(64),GATES(85),COLOR(101),SHAPE(127),GAIN(111),FLAGS(TRISAW)
GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO)
GO4K_FST AMOUNT(61),DEST(2*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FST AMOUNT(63),DEST(3*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FOP OP(FOP_POP)
GO4K_BEGIN_PARAMDEF(Instrument4)
GO4K_ENV ATTAC(39),DECAY(62),SUSTAIN(0),RELEASE(30),GAIN(71)
GO4K_VCO TRANSPOSE(88),DETUNE(62),PHASE(14),GATES(0),COLOR(53),SHAPE(27),GAIN(72),FLAGS(SINE)
GO4K_VCO TRANSPOSE(88),DETUNE(66),PHASE(64),GATES(0),COLOR(113),SHAPE(64),GAIN(128),FLAGS(SINE)
GO4K_FOP OP(FOP_ADDP)
GO4K_FOP OP(FOP_MULP)
GO4K_VCF FREQUENCY(26),RESONANCE(36),VCFTYPE(PEAK)
GO4K_VCF FREQUENCY(80),RESONANCE(44),VCFTYPE(LOWPASS)
GO4K_DST DRIVE(109), SNHFREQ(85), FLAGS(0)
GO4K_PAN PANNING(64)
GO4K_DLL PREGAIN(72),DRY(123),FEEDBACK(90),DAMP(49),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1)
GO4K_DLL PREGAIN(95),DRY(128),FEEDBACK(83),DAMP(0),FREQUENCY(8),DEPTH(55),DELAY(17),COUNT(1)
GO4K_FOP OP(FOP_XCH)
GO4K_DLL PREGAIN(98),DRY(112),FEEDBACK(62),DAMP(45),FREQUENCY(0),DEPTH(0),DELAY(18),COUNT(1)
GO4K_FOP OP(FOP_XCH)
GO4K_OUT GAIN(72), AUXSEND(97)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument2)
GO4K_ENV ATTAC(0),DECAY(83),SUSTAIN(0),RELEASE(0),GAIN(42)
GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_ENV ATTAC(0),DECAY(75),SUSTAIN(0),RELEASE(0),GAIN(128)
GO4K_DST DRIVE(13), SNHFREQ(128), FLAGS(0)
GO4K_FST AMOUNT(86),DEST(6*MAX_UNIT_SLOTS+1+FST_SET)
GO4K_FOP OP(FOP_MULP)
GO4K_VCO TRANSPOSE(38),DETUNE(109),PHASE(16),GATES(85),COLOR(64),SHAPE(97),GAIN(93),FLAGS(TRISAW)
GO4K_FOP OP(FOP_MULP)
GO4K_PAN PANNING(64)
GO4K_OUT GAIN(128), AUXSEND(0)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument3)
GO4K_ENV ATTAC(0),DECAY(74),SUSTAIN(0),RELEASE(0),GAIN(80)
GO4K_FST AMOUNT(125),DEST(0*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_ENV ATTAC(0),DECAY(57),SUSTAIN(64),RELEASE(0),GAIN(128)
GO4K_FST AMOUNT(66),DEST(6*MAX_UNIT_SLOTS+1+FST_SET)
GO4K_FST AMOUNT(58),DEST(7*MAX_UNIT_SLOTS+1+FST_SET)
GO4K_FOP OP(FOP_POP)
GO4K_VCO TRANSPOSE(63),DETUNE(64),PHASE(0),GATES(85),COLOR(64),SHAPE(127),GAIN(83),FLAGS(NOISE)
GO4K_VCO TRANSPOSE(62),DETUNE(59),PHASE(14),GATES(85),COLOR(64),SHAPE(89),GAIN(67),FLAGS(SINE)
GO4K_VCO TRANSPOSE(68),DETUNE(64),PHASE(0),GATES(85),COLOR(42),SHAPE(65),GAIN(14),FLAGS(TRISAW)
GO4K_VCF FREQUENCY(98),RESONANCE(128),VCFTYPE(LOWPASS)
GO4K_FOP OP(FOP_ADDP)
GO4K_FOP OP(FOP_ADDP)
GO4K_FOP OP(FOP_MULP)
GO4K_VCF FREQUENCY(22),RESONANCE(11),VCFTYPE(HIGHPASS)
GO4K_PAN PANNING(64)
GO4K_OUT GAIN(45), AUXSEND(28)
GO4K_DLL PREGAIN(81),DRY(128),FEEDBACK(90),DAMP(0),FREQUENCY(11),DEPTH(48),DELAY(18),COUNT(1)
GO4K_OUT GAIN(65), AUXSEND(52)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Instrument5)
GO4K_ENV ATTAC(53),DECAY(82),SUSTAIN(128),RELEASE(88),GAIN(128)
GO4K_VCO TRANSPOSE(69),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO)
GO4K_FST AMOUNT(72),DEST(11*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FOP OP(FOP_POP)
GO4K_VCO TRANSPOSE(73),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO)
GO4K_FST AMOUNT(56),DEST(12*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FST AMOUNT(56),DEST(12*MAX_UNIT_SLOTS+5+FST_SET)
GO4K_FOP OP(FOP_POP)
GO4K_VCO TRANSPOSE(77),DETUNE(64),PHASE(0),GATES(85),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE|LFO)
GO4K_FST AMOUNT(72),DEST(13*MAX_UNIT_SLOTS+2+FST_SET)
GO4K_FOP OP(FOP_POP)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW)
GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(85),COLOR(0),SHAPE(64),GAIN(128),FLAGS(TRISAW)
GO4K_ENV ATTAC(11),DECAY(99),SUSTAIN(0),RELEASE(0),GAIN(120)
GO4K_FST AMOUNT(83),DEST(8*MAX_UNIT_SLOTS+4+FST_SET)
GO4K_FST AMOUNT(93),DEST(6*MAX_UNIT_SLOTS+5+FST_SET+FST_POP)
GO4K_ENV ATTAC(42),DECAY(0),SUSTAIN(128),RELEASE(39),GAIN(128)
GO4K_VCO TRANSPOSE(76),DETUNE(64),PHASE(8),GATES(0),COLOR(128),SHAPE(64),GAIN(128),FLAGS(SINE)
GO4K_FOP OP(FOP_ADDP)
GO4K_FOP OP(FOP_ADDP)
GO4K_VCF FREQUENCY(104),RESONANCE(96),VCFTYPE(LOWPASS)
GO4K_VCO TRANSPOSE(64),DETUNE(71),PHASE(69),GATES(0),COLOR(73),SHAPE(75),GAIN(64),FLAGS(TRISAW)
GO4K_FOP OP(FOP_MULP)
GO4K_DLL PREGAIN(64),DRY(64),FEEDBACK(64),DAMP(0),FREQUENCY(0),DEPTH(0),DELAY(19),COUNT(1)
GO4K_VCF FREQUENCY(39),RESONANCE(82),VCFTYPE(LOWPASS)
GO4K_VCF FREQUENCY(15),RESONANCE(128),VCFTYPE(PEAK)
GO4K_PAN PANNING(64)
GO4K_DLL PREGAIN(128),DRY(0),FEEDBACK(0),DAMP(0),FREQUENCY(0),DEPTH(0),DELAY(20),COUNT(1)
GO4K_OUT GAIN(128), AUXSEND(54)
GO4K_OUT GAIN(128), AUXSEND(40)
GO4K_END_PARAMDEF
GO4K_BEGIN_PARAMDEF(Global)
GO4K_ACC ACCTYPE(AUX)
GO4K_DLL PREGAIN(39),DRY(90),FEEDBACK(93),DAMP(62),FREQUENCY(0),DEPTH(0),DELAY(1),COUNT(8)
GO4K_DLL PREGAIN(45),DRY(128),FEEDBACK(126),DAMP(79),FREQUENCY(7),DEPTH(68),DELAY(1),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_DLL PREGAIN(41),DRY(128),FEEDBACK(93),DAMP(74),FREQUENCY(0),DEPTH(0),DELAY(9),COUNT(8)
GO4K_DLL PREGAIN(45),DRY(128),FEEDBACK(124),DAMP(76),FREQUENCY(8),DEPTH(45),DELAY(9),COUNT(8)
GO4K_FOP OP(FOP_XCH)
GO4K_ACC ACCTYPE(OUTPUT)
GO4K_FOP OP(FOP_ADDP2)
GO4K_OUT GAIN(67), AUXSEND(0)
GO4K_OUT GAIN(64), AUXSEND(0)
GO4K_END_PARAMDEF
go4k_synth_parameter_values_end
%ifdef USE_SECTIONS
@ -766,8 +786,6 @@ _go4k_delay_times
dw 1516
dw 1580
dw 1642
dw 18248
dw 12165
dw 27372
dw 512
dw 21381
dw 12027
%endif

BIN
8klang.merge Normal file

Binary file not shown.

View File

@ -8,8 +8,8 @@ MUSIC_BEATS_PER_BAR=4.0
########### Visuals ############
SHADER_FILE=shader.glsl
RESOLUTION_X=1280
RESOLUTION_Y=720
RESOLUTION_X=1920
RESOLUTION_Y=1080
USE_TIME_UNIFORM=1
TIME_UNIFORM_NAME='u_time'
@ -43,11 +43,11 @@ USE_WIDECHAR_TEXTS=1
########### Time base ###########
USE_TIME_DIVIDER_IN_X86_CODE=1
TIME_DIVIDER=72993.102
TIME_DIVIDER=64145.453
TIME_BASE=bars
AUDIO_DELAY=2048
PROD_END_TIME=5257472
PROD_END_TIME=3209248
########### Final product ###########
@ -61,9 +61,9 @@ QUOTE=\"
CRINKLER_ORDERTRIES=400
AUDIO_BUFFER_ALLOCATED_LENGTH=5257472
AUDIO_BUFFER_ALLOCATED_LENGTH=3209248
AUDIO_SAMPLING_RATE=44100
LOOP_END=5.0
LOOP_START=3.0
LOOP_ENABLED=0
TIME_DIVIDER_INT=72993
TIME_DIVIDER_INT=64145

View File

@ -7,13 +7,17 @@ include $(PARENT_CONFIG)
# Visuals
EXE_LINKER_PROGRAM=GNU ld
CRINKLER_ORDERTRIES=400
EXE_LINKER_PROGRAM=Crinkler
CRINKLER_ORDERTRIES=4000
SHADER_FILE=shader_minified.h
TIME_UNIFORM_NAME='y'
TIME_UNIFORM_NAME='m'
RESOLUTION_UNIFORM_NAME='v'
TEXTS_UNIFORM_NAME='d'
TEXTS_UNIFORM_NAME='f'
USE_WIDECHAR_TEXTS=1
TIME_DIVIDER=72993.102
TIME_DIVIDER=64145.453
TIME_BASE=bars
TIME_DIVIDER_INT=72993
TIME_DIVIDER_INT=64145
TWO_PASS_RENDERING=1
SECOND_PASS_NEGATIVE_TIME=1
USE_TEXTS=0
USE_TEXTS_UNIFORM=0

BIN
music/4k_uus.4kp Normal file

Binary file not shown.

BIN
music/4k_uusi.xrns Normal file

Binary file not shown.

416
patterns.dbg Normal file
View File

@ -0,0 +1,416 @@
Instrument0:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, 57, 57, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, 57, 57, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, 57, 57, 57, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 57, HLD, HLD, HLD, 57, 57, HLD, HLD, 57, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0,
Instrument1:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, HLD, HLD, HLD, 46, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, 46, 46, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, 46, 46, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, 46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 46, 46, HLD, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0,
Instrument2:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD, 48, HLD, 48, HLD, HLD, HLD, 48, HLD,
HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0,
Instrument3:
50, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
48, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, 50, HLD, 53, HLD,
43, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 43, HLD, 45, HLD, 46, HLD, 48, HLD,
46, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 48, HLD, 50, HLD,
52, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 45, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
50, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD,
HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument4:
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 71, 0,
62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 69, 0, 65, 0, 64, 0, 62, 0, 64, 0, 65, 0, 72, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument5:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD,
48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD,
46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD,
43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD,
50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD,
48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD,
46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD,
43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD,
50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD,
48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD,
46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD,
43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD,
50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD, 50, 0, 50, HLD,
48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD, 48, 0, 48, HLD,
46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD, 46, 0, 46, HLD,
43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, HLD, 43, 0, 43, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument6:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument7:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument8:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument9:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument10:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument11:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument12:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument13:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument14:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Instrument15:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

View File

@ -1,12 +1,17 @@
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;
uniform vec2 u_mouse;
uniform sampler2D texture_sampler;
uniform sampler2D texts;
struct Ray {
vec3 rd;
vec3 dir;
vec3 rayDir;
vec3 rayOrigin;
vec3 hitPos;
float distance;
bool isHit;
};
mat2 scale(vec2 scale){
@ -622,52 +627,47 @@ float sdCog(vec3 pos, float angle) {
float sdHex(vec3 pos, float i, float angle) {
vec3 po = pos;
vec3 po = pos;
po.xz *= Rot(angle);
po.yz *= Rot(angle);
pR(po.yz, PI/2.);
float d1 = fHexagonCircumcircle(po, vec2(0.5+i, .1));
float d2 = fHexagonCircumcircle(po, vec2(0.2+i, .1));
return fOpDifferenceRound(d1,d2,0.1);
}
// Scene
vec2 mapScene(in vec3 p) {
/*
* Scene geometry
* returns vec2(distance, material.id)
*/
vec2 mapScene(in vec3 pos) {
float mat = 0.;
float d = 1e10;
//float dGround = p.y + 2.5;
//d = min(d, dGround);
vec3 po = p;
vec3 po = pos;
//po.y += sin(u_time);
// pMod3(po, vec3(3.));
po.xy *= scale(vec2(1.3, 1.3));
po.xz *= Rot(.745);
const float num = 6.;
const float num = 6.;
for (float i = 1.; i <= num; i++) {
// pos.z += i*.1;
float a = sdHex(po,i*0.35, u_time + abs( 2. + 0.4 * sin(u_time)) * i*3.1415/num);
d = min(d,a);
if (d == a) mat = 1. + mod(i,3.);
}
/*float c2 = sdCog(p, u_time);
}
/* float c2 = sdCog(pos, 0.);
d = min(d, c2);
if ( d == c2) mat = 4.;
/*
float c3 = fBox(pos+vec3(0.0, .0, 0.), vec3(1., 1.,1.));
d = min(d, c3);
if ( d == c3) mat = 4.;
*/
// float c3 = fBox(p+vec3(0.5, .87, 0.), vec3(1., 1.,1.));
// d = min(d, c3);
// if ( d == c1) mat = 1.;
//if ( d == c3) mat = 3.;
return vec2(d, mat);
}
@ -728,19 +728,6 @@ float softshadow( in vec3 ro, in vec3 rd, float mint, float maxt, float w )
return 0.25*(1.0+res)*(1.0+res)*(2.0-res);
}
float castShadow(vec3 ro, vec3 rd) {
float res = 1.0;
float t = 0.001;
for(int i = 0; i < 40; i++) {
float h = mapScene(ro + t* rd).x;
res = min(res, 10.0*h/t);
if (abs(h) < (0.001*t) ) break;
t += h;
if (t > 20.) break;
}
return clamp(res,0., 1.);
}
vec3 calcNormal(vec3 pos) {
vec2 e = vec2(.001, 0.);
vec3 n = vec3( mapScene(pos+e.xyy).x - mapScene(pos-e.xyy).x,
@ -759,8 +746,6 @@ vec3 eRot(vec3 p, vec3 ax, float ro) {
return mix(dot(ax,p)*ax, p, cos(ro)) + sin(ro)*cross(ax,p);
}
vec3 addPointLight(vec3 light_pos, vec3 light_color, float shininess, vec3 v, vec3 dir, vec3 n, float occ) {
vec3 Ks = vec3( .5454 );
vec3 Kd = vec3( 1. );
@ -770,8 +755,7 @@ vec3 addPointLight(vec3 light_pos, vec3 light_color, float shininess, vec3 v, ve
vec3 specular = vec3( max( 0.0, dot( vl, ref ) ) );
vec3 F = fresnel( Ks, normalize( vl - dir ), vl )*occ;
float shadow = softshadow(v+n*0.01,light_pos, .01, 30., 18.);
//float shadow = castShadow(v + n*0.02, light_pos);
specular = pow( specular, vec3( shininess ) )*occ;
specular = pow( specular, vec3( shininess ) )*occ;
return light_color * mix( diffuse, specular, F ) * shadow;
}
@ -848,55 +832,21 @@ vec3 postProcess(vec3 col) {
float constrast = .5;
col = mix(col, smoothstep(0.0, 1.0, col), constrast);
// Colour mapping
col *= vec3(1.0, 1.0, 1.0);
// gamma
col = pow( col, vec3(1.0/2.2) );
col = pow( col, vec3(1.0/2.2) ); // gamma
// fade in at the beginning
//col*=vec3(clamp((u_time-1.8)*0.5,0., 1.));
// fade out at the end
// col*=vec3(clamp((120.-u_time)*.35, 0., 1.));
return col;
}
vec3 getCameraRayDir(vec2 uv, vec3 camPos, vec3 camTarget)
{
// Calculate camera's "orthonormal basis", i.e. its transform matrix components
vec3 camForward = normalize(camTarget-camPos );
vec3 camRight = normalize(cross(vec3(.0, 1.0, 0.0), camForward));
vec3 camUp = normalize(cross(camForward, camRight));
float fov = 0.7;
vec3 vDir = normalize(uv.x * camRight + uv.y * camUp + camForward * fov);
return vDir;
}
vec3 getCameraRayDir2(vec2 uv, vec3 camPos, vec3 lookAt, float zoom){
vec3 f = normalize(lookAt - camPos);
vec3 r = cross(vec3(0.0,1.0,0.0),f);
vec3 u = cross(f,r);
vec3 c=camPos+f*zoom;
vec3 i=c+uv.x*r+uv.y*u;
return normalize(i-camPos);
}
vec3 getCameraFov(vec2 uv, vec3 camPos, vec3 camTarget) {
vec3 camForward = normalize(camTarget-camPos);
vec3 camRight = normalize(cross(vec3(0.0, 1.0, 0.0), camForward));
vec3 camUp = normalize(cross(camForward,camRight));
float fov = 1.7;
// Depth of field
float dof = .25;
vec2 h = vec2( noise(gl_FragCoord.xy, .13), noise(gl_FragCoord.xy, .4));
//vec3 h= rnd23(gl_FragCoord.xy);
vec3 voff = sqrt(h.x)*(camRight*sin(h.y*6.283)+camUp*cos(h.y*6.283))*dof;
// camTarget -=voff;
float focusdistance = 150.2;
return normalize(uv.x * camRight + uv.y * camUp + fov * camForward + voff * fov/focusdistance);
mat3 getCamera(vec3 camPosition, vec3 lookAt) {
vec3 camF = normalize(lookAt - camPosition);
vec3 camR = normalize(cross(vec3(0., 1., 0.), camF));
vec3 camU = cross(camF, camR);
return mat3(camR, camU, camF);
}
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
@ -908,31 +858,24 @@ vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
return mix( col, fogColor, fogAmount );
}
/**
* renders the scene
* @param uv uv coordinate from gl_fragCoord
*/
vec3 render(vec2 uv) {
bool useDof = !true;
//vec2 uv = (2.0 * gl_FragCoord.xy - u_resolution.xy) / u_resolution.y;
float angle = -2.4 +u_time*0.4;
//angle = 0.;
// camera
vec3 camPos = vec3(0., 3., -4.);
vec3 camTarget = vec3(0., 0., 0.);
vec3 rayDir;
if (useDof) {
rayDir = getCameraFov(uv, camPos, camTarget);
} else {
rayDir = getCameraRayDir2(uv, camPos, camTarget, 1.0);
}
vec3 col = vec3(0.051, 0.0667, 0.1529);
//vec3 col = vec3(0.0314, 0.0118, 0.1255) + rayDir.y * 0.4;
// camera
vec3 camPos = vec3( sin(u_time)*2., 0., 4.);
vec3 lookAt = vec3(0., 0., 0.);
vec3 rayDir = getCamera(camPos, lookAt) * normalize(vec3(uv, 1.2));
vec3 hitPos = vec3(0.);
vec3 t = castRay(camPos, rayDir, hitPos);
vec3 rd = rayDir;
vec3 col = vec3(0.051, 0.0667, 0.1529);
if (t.z > 0.) {
vec3 nor = calcNormal(hitPos);
col = shading(hitPos, nor, rayDir , t.y);
@ -948,15 +891,15 @@ vec3 render(vec2 uv) {
nor = calcNormal(hitPos);
col += 0.1 * shading(hitPos, nor, rayDir , t2.y);
/* rayDir = normalize(reflect(rayDir, nor));
/* rayDir = normalize(reflect(rayDir, nor));
rayOrigin = hitPos + (rayDir * 0.01);
vec3 t3 = castReflectedRay(rayOrigin, rayDir, hitPos);
if (t3.z > 0.) {
hitPos = rayOrigin + rayDir * t3.x;
nor = calcNormal(hitPos);
col += 0.025 * shading(hitPos, nor, rayDir , t3.y);
} */
col += 0.05 * shading(hitPos, nor, rayDir , t3.y);
} */
}
}
// pixelColor*exp(-distance*b) + fogColor*(1.0-exp(-distance*b));
@ -973,9 +916,10 @@ void main()
{
vec3 finalColor = vec3(0.);
/*
const float AA_SIZE = 1.;
float count = 0.0;
/*
for (float aaY = 0.0; aaY < AA_SIZE; aaY++) {
for (float aaX = 0.0; aaX < AA_SIZE; aaX++) {
finalColor += render(getUV(vec2( aaX, aaY)));
@ -983,10 +927,17 @@ void main()
}
}
finalColor /= count; */
finalColor += render(getUV(vec2( 0.,0.)));
finalColor = postProcess(finalColor);
finalColor += render(getUV(vec2( 0.,0.)));
finalColor = postProcess(finalColor);
// fade in at the beginning
// finalColor*=vec3(clamp((u_time-.5)*0.35,0., 1.));
// fade out at the end
// finalColor*=vec3(clamp((120.-u_time)*.35, 0., 1.));
gl_FragColor = vec4(finalColor, 1.);
}

View File

@ -1,150 +1,210 @@
// Generated with Shader Minifier 1.3.6 (https://github.com/laurentlb/Shader_Minifier/)
#ifndef SHADER_MINIFIED_H_
# define SHADER_MINIFIED_H_
# define VAR_texts "d"
# define VAR_texture_sampler "m"
# define VAR_texts "f"
# define VAR_texture_sampler "i"
# define VAR_u_mouse "k"
# define VAR_u_resolution "v"
# define VAR_u_time "y"
# define VAR_u_time "m"
const char *__temp_cleaned_shader_glsl =
"uniform vec2 v;"
"uniform float y;"
"uniform sampler2D m,d;"
"const float i=2.*acos(-1.),f=sqrt(5.)*.5+.5;"
"float n(vec3 v)"
"uniform float m;"
"uniform vec2 k;"
"uniform sampler2D i,f;struct Ray{vec3 rayDir;vec3 rayOrigin;vec3 hitPos;float distance;bool isHit;};"
"const float r=2.*acos(-1.),d=sqrt(5.)*.5+.5;"
"float x(vec3 v,vec2 m)"
"{"
"vec3 x=vec3(0),y=vec3(0,0,1)-x;"
"return length(y*clamp(dot(v-x,y)/dot(y,y),0.,1.)+x-v);"
"vec3 f=abs(v);"
"return max(f.y-m.y,max(f.x*sqrt(3.)*.5+f.z*.5,f.z)-m.x);"
"}"
"float n(float v,float y)"
"void x(inout vec2 v)"
"{"
"return min(-.1,max(v,y))+length(max(vec2(.1+v,.1+y),vec2(0)));"
"float m=acos(-1.)/2.;"
"v=cos(m)*v+sin(m)*vec2(v.y,-v.x);"
"}"
"mat2 s(float v)"
"float p(float v,float m)"
"{"
"float y=sin(v),x=cos(v);"
"return mat2(x,-y,y,x);"
"return min(-.1,max(v,m))+length(max(vec2(.1+v,.1+m),vec2(0)));"
"}"
"float s(vec3 v,float y)"
"mat2 p(float v)"
"{"
"vec2 m=vec2(y,abs(v.z)-.15);"
"return min(max(m.x,m.y),0.)+length(max(m,0.));"
"float m=sin(v),f=cos(v);"
"return mat2(f,-m,m,f);"
"}"
"float t(vec2 v)"
"float p(vec3 v,float m,float i)"
"{"
"float y=1.-smoothstep(-.2,.8,sin(atan(v.y,v.x)*12.))*.14;"
"return smoothstep(y,y+2.,length(v)*2.);"
"vec3 f=v;"
"f.xz*=p(i);"
"f.yz*=p(i);"
"x(f.yz);"
"float r=x(f,vec2(.5+m,.1)),n=x(f,vec2(.2+m,.1));"
"return p(r,-n);"
"}"
"float t(vec3 v,float y)"
"vec2 n(vec3 v)"
"{"
"v.xy*=s(y);"
"float m=s(v,t(v.xy)),x=n(v-vec3(0,0,-.5))-.2;"
"return.8*n(m,-x)-.02;"
"}"
"vec2 p(vec3 v)"
"{"
"float m=1e10;"
"m=min(m,v.y+1.5);"
"float x=t(v+vec3(1,0,0),y);"
"m=min(m,x);"
"float n=t(v+vec3(.5,-.87,0),-y);"
"m=min(m,n);"
"float f=t(v+vec3(.5,.87,0),-y);"
"m=min(m,f);"
"float d=0.;"
"if(m==x)"
"d=1.;"
"if(m==n)"
"d=2.;"
"if(m==f)"
"d=3.;"
"return vec2(m,d);"
"}"
"vec2 p(vec3 v,vec3 y)"
"{"
"float m=0.,f=0.;"
"for(int i=0;i<100;i++)"
"float f=0.,r=1e10;"
"vec3 i=v;"
"i.xz*=p(.745);"
"for(float x=1.;x<=6.;x++)"
"{"
"vec3 x=v+y*m;"
"vec2 n=p(x);"
"m+=n.x;"
"f=n.y;"
"if(m>20.||n.x<abs(.001*m))"
"float n=p(i,x*.35,m+abs(2.+.4*sin(m))*x*3.1415/6.);"
"r=min(r,n);"
"if(r==n)"
"f=1.+mod(x,3.);"
"}"
"return vec2(r,f);"
"}"
"vec3 n(vec3 v,vec3 m,inout vec3 f)"
"{"
"float r=0.,i=0.,x=0.;"
"for(int e=0;e<150;e++)"
"{"
"f=v+m*r;"
"vec2 d=n(f);"
"r+=d.x;"
"i=d.y;"
"if(r>80.)"
"break;"
"if(d.x<abs(.001*r))"
"{"
"x=1.;"
"break;"
"}"
"}"
"if(r>80.)"
"r=-1.;"
"return vec3(r,i,x);"
"}"
"vec3 x(vec3 v,vec3 m,vec3 f)"
"{"
"float r=0.,i=0.,x=0.;"
"for(int e=0;e<50;e++)"
"{"
"f=v+m*r;"
"vec2 d=n(f);"
"r+=d.x;"
"i=d.y;"
"if(r>40.)"
"break;"
"if(d.x<abs(.001*r))"
"{"
"x=1.;"
"break;"
"}"
"}"
"if(r>40.)"
"r=-1.;"
"return vec3(r,i,x);"
"}"
"float n(vec3 v,vec3 m)"
"{"
"float r=1.,f=.01;"
"for(int i=0;i<40;i++)"
"{"
"if(f>30.)"
"break;"
"float x=n(v+f*m).x;"
"r=min(r,x/(18.*f));"
"f+=clamp(x,.005,.5);"
"if(r<-1.||f>30.)"
"break;"
"}"
"if(m>20.)"
"m=-1.;"
"return vec2(m,f);"
"r=max(r,-1.);"
"return.25*(1.+r)*(1.+r)*(2.-r);"
"}"
"float x(vec3 v,vec3 y)"
"{"
"float m=1.,f=.001;"
"for(int i=0;i<100;i++)"
"{"
"vec3 x=v+f*y;"
"float n=p(x).x;"
"m=min(m,10.*n/f);"
"if(abs(n)<.001*f)"
"break;"
"f+=n;"
"if(f>20.)"
"break;"
"}"
"return clamp(m,0.,1.);"
"}"
"vec3 x(vec3 v)"
"vec3 s(vec3 v)"
"{"
"vec2 m=vec2(.001,0);"
"vec3 y=vec3(p(v+m.xyy).x-p(v-m.xyy).x,p(v+m.yxy).x-p(v-m.yxy).x,p(v+m.yyx).x-p(v-m.yyx).x);"
"return normalize(y);"
"vec3 r=vec3(n(v+m.xyy).x-n(v-m.xyy).x,n(v+m.yxy).x-n(v-m.yxy).x,n(v+m.yyx).x-n(v-m.yyx).x);"
"return normalize(r);"
"}"
"vec3 n(vec3 v,vec3 m,vec3 y)"
"vec3 s(vec3 v,vec3 m)"
"{"
"return v+(1.-v)*pow(clamp(1.-dot(m,y),0.,1.),5.);"
"vec3 r=vec3(.5454);"
"return r+(1.-r)*pow(clamp(1.-dot(v,m),0.,1.),5.);"
"}"
"vec3 n(vec3 v,vec3 y,vec3 m,float f)"
"vec3 n(vec3 v,vec3 m,float r,vec3 f,vec3 i,vec3 x,float y)"
"{"
"float d=1.;"
"vec3 i=vec3(0),p=reflect(m,y),c=vec3(.5),a=vec3(1),s=vec3(.1686);"
"if(f==0.)"
"s=vec3(.1412),d=11.1;"
"else if(f==1.)"
"s=vec3(.1765,1.1961,.2275),d=31.;"
"else if(f==2.)"
"s=vec3(1.1765,.1961,.2275),d=21.;"
"else if(f==3.)"
"s=vec3(.1765,.1961,1.2275),d=21.;"
"{"
"vec3 l=normalize(vec3(-2,.3,10)-v),r=vec3(max(0.,dot(l,p))),t=n(c,normalize(l-m),l);"
"r=pow(r,vec3(d));"
"i+=s*r*(vec3(.71,.51,.72)*5.)*mix(a*vec3(max(0.,dot(l,y))),r,t);"
"}"
"{"
"vec3 l=normalize(vec3(5,5,-20)-v),r=vec3(max(0.,dot(l,p))),t=n(c,normalize(l-m),l);"
"r=pow(r,vec3(d));"
"i+=s*r*(vec3(.14,.36,.83)*7.)*mix(a*vec3(max(0.,dot(l,y))),r,t);"
"}"
"{"
"vec3 l=vec3(0,.4,1);"
"float r=clamp(dot(y,l),0.,1.),t=x(v+y*.02,l);"
"i+=s*vec3(1.1,1.2,1.5)*r*r*t;"
"}"
"i+=s*vec3(.0353,.2667,.4784)*clamp(dot(y,vec3(0,.6,-1)),0.,1.);"
"return i;"
"vec3 d=normalize(f),e=vec3(max(0.,dot(d,reflect(i,x)))),z=s(normalize(d-i),d)*y;"
"float k=n(f+x*.01,v);"
"e=pow(e,vec3(r))*y;"
"return m*mix(vec3(1)*vec3(max(0.,dot(d,x))),e,z)*k;"
"}"
"float t(vec3 v,vec3 m)"
"{"
"float r=0.,f=1.;"
"for(int i=0;i<8;i++)"
"{"
"float x=.01+.02*float(i*i),d=n(v+m*x).x;"
"r+=(x-d)*f;"
"f*=.85;"
"}"
"return 1.-clamp(.6*r,0.,1.);"
"}"
"vec3 n(vec3 v,vec3 m,vec3 f,float r)"
"{"
"float i=1.,x=t(v,m);"
"vec3 d=vec3(.1529);"
"if(r==0.)"
"d=vec3(.2863,.1059,.2431),i=1.5;"
"else if(r==1.)"
"d=vec3(.3294,.0941,.6),i=.6;"
"else if(r==2.)"
"d=vec3(.5804,.9647,1),i=1.;"
"else if(r==3.)"
"d=vec3(0),i=1e2;"
"else if(r==4.)"
"d=vec3(.9961,1,.9922),i=.3;"
"vec3 e=vec3(0);"
"e+=n(vec3(0,-40,-1),vec3(.56,.44,.18)*2.,i,v,f,m,x);"
"e+=n(vec3(-20,4,10),vec3(.04,.2,.71)*2.,i,v,f,m,x);"
"vec3 z=vec3(0,4,2);"
"float s=n(v+m*.01,z);"
"e+=vec3(.6627,.7098,.8863)*clamp(dot(m,z),0.,1.)*s*x;"
"e+=vec3(.1333,.1333,.1216)*clamp(dot(m,normalize(z*vec3(-1,0,-1))),0.,1.)*x;"
"return d*max(vec3(0),e);"
"}"
"vec3 t(vec3 r)"
"{"
"vec2 i=gl_FragCoord.xy/v.xy;"
"r=mix(r,r*smoothstep(.8,.4,length(i-vec2(.5))),.9);"
"r=mix(r,smoothstep(0.,1.,r),.5);"
"r*=vec3(1);"
"return pow(r,vec3(1./2.2));"
"}"
"mat3 e(vec3 m)"
"{"
"vec3 v=normalize(vec3(0)-m),r=normalize(cross(vec3(0,1,0),v));"
"return mat3(r,cross(v,r),v);"
"}"
"vec3 w(vec2 v)"
"{"
"vec3 r=vec3(sin(m)*2.,0,4),f=e(r)*normalize(vec3(v,1.2)),i=vec3(0),d=n(r,f,i),z=f,k=vec3(.051,.0667,.1529);"
"if(d.z>0.)"
"{"
"vec3 y=s(i);"
"k=n(i,y,f,d.y);"
"k=k*exp(-d.x*.04)+mix(k,mix(vec3(.3686,.2431,.4392),vec3(.4,.7294,.9216),pow(max(dot(z,vec3(0,.3,-1)),0.),8.)),1.-exp(-d.x*.04))*(1.-exp(-d.x*.04));"
"f=normalize(reflect(f,y));"
"vec3 c=i+f*.01,p=x(c,f,i);"
"if(p.z>0.)"
"i=c+f*p.x,y=s(i),k+=.1*n(i,y,f,p.y);"
"}"
"return k;"
"}"
"vec2 e()"
"{"
"vec2 r=2.*((gl_FragCoord.xy+vec2(0)*.5)/v.xy-.5);"
"r.x*=v.x/v.y;"
"return r;"
"}"
"void main()"
"{"
"vec2 m=(2.*gl_FragCoord.xy-v.xy)/v.y;"
"float f=y*.4;"
"vec3 i=vec3(0,0,1),d=i+vec3(4.*sin(f),cos(f),4.*cos(f)),l=normalize(i-d),r=normalize(cross(l,vec3(0,1,0))),s=normalize(m.x*r+m.y*normalize(cross(r,l))+l*2.),c=vec3(.1451,.1098,.1608)-vec3(.9725,.5176,0)*s.y;"
"vec2 t=p(d,s);"
"if(t.x>0.)"
"{"
"vec3 a=d+s*t.x,C=x(a);"
"c=n(a,C,s,t.y);"
"c=mix(c,vec3(.17,.16,.24),1.-exp(-t.x*.01));"
"}"
"gl_FragColor=vec4(pow(c,vec3(1./1.3)),1);"
"vec3 r=vec3(0);"
"r+=w(e());"
"r=t(r);"
"gl_FragColor=vec4(r,1);"
"}";
#endif // SHADER_MINIFIED_H_

992
shader_orig.glsl Normal file
View File

@ -0,0 +1,992 @@
6precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;
uniform sampler2D texture_sampler;
uniform sampler2D texts;
struct Ray {
vec3 rd;
vec3 dir;
};
mat2 scale(vec2 scale){
return mat2(1. / scale.x, 0.0, 0.0, 1./scale.y);
}
////////////////////////////////////////////////////////////////
//
// HG_SDF
//
// GLSL LIBRARY FOR BUILDING SIGNED DISTANCE BOUNDS
//
// version 2021-07-28
//
// Check https://mercury.sexy/hg_sdf for updates
// and usage examples. Send feedback to spheretracing@mercury.sexy.
//
// Brought to you by MERCURY https://mercury.sexy/
//
//
//
// Released dual-licensed under
// Creative Commons Attribution-NonCommercial (CC BY-NC)
// or
// MIT License
// at your choice.
//
// SPDX-License-Identifier: MIT OR CC-BY-NC-4.0
//
// /////
////////////////////////////////////////////////////////////////
//
// HELPER FUNCTIONS/MACROS
//
////////////////////////////////////////////////////////////////
const float PI = 3.14159265;
const float TAU = (2.*PI);
const float PHI = sqrt(5.)*0.5 + 0.5;
// Sign function that doesn't return 0
float sgn(float x) {
return (x < 0. )? -1. : 1.;
}
vec2 sgn(vec2 v) {
return vec2((v.x<0.)?-1.:1., (v.y<0.)?-1.:1.);
}
float square (float x) {
return x*x;
}
vec2 square (vec2 x) {
return x*x;
}
vec3 square (vec3 x) {
return x*x;
}
float lengthSqr(vec3 x) {
return dot(x, x);
}
// Maximum/minumum elements of a vector
float vmax(vec2 v) {
return max(v.x, v.y);
}
float vmax(vec3 v) {
return max(max(v.x, v.y), v.z);
}
float vmax(vec4 v) {
return max(max(v.x, v.y), max(v.z, v.w));
}
float vmin(vec2 v) {
return min(v.x, v.y);
}
float vmin(vec3 v) {
return min(min(v.x, v.y), v.z);
}
float vmin(vec4 v) {
return min(min(v.x, v.y), min(v.z, v.w));
}
////////////////////////////////////////////////////////////////
//
// PRIMITIVE DISTANCE FUNCTIONS
//
////////////////////////////////////////////////////////////////
//
// Conventions:
//
// Everything that is a distance function is called fSomething.
// The first argument is always a point in 2 or 3-space called <p>.
// Unless otherwise noted, (if the object has an intrinsic "up"
// side or direction) the y axis is "up" and the object is
// centered at the origin.
//
////////////////////////////////////////////////////////////////
float fSphere(vec3 p, float r) {
return length(p) - r;
}
// Plane with normal n (n is normalized) at some distance from the origin
float fPlane(vec3 p, vec3 n, float distanceFromOrigin) {
return dot(p, n) + distanceFromOrigin;
}
// Cheap Box: distance to corners is overestimated
float fBoxCheap(vec3 p, vec3 b) { //cheap box
return vmax(abs(p) - b);
}
// Box: correct distance to corners
float fBox(vec3 p, vec3 b) {
vec3 d = abs(p) - b;
return length(max(d, vec3(0))) + vmax(min(d, vec3(0)));
}
// Same as above, but in two dimensions (an endless box)
float fBox2Cheap(vec2 p, vec2 b) {
return vmax(abs(p)-b);
}
float fBox2(vec2 p, vec2 b) {
vec2 d = abs(p) - b;
return length(max(d, vec2(0.))) + vmax(min(d, vec2(0.)));
}
// Endless "corner"
float fCorner (vec2 p) {
return length(max(p, vec2(0.))) + vmax(min(p, vec2(0.)));
}
// Cylinder standing upright on the xz plane
float fCylinder(vec3 p, float r, float height) {
float d = length(p.xz) - r;
d = max(d, abs(p.y) - height);
return d;
}
// Capsule: A Cylinder with round caps on both sides
float fCapsule(vec3 p, float r, float c) {
return mix(length(p.xz) - r, length(vec3(p.x, abs(p.y) - c, p.z)) - r, step(c, abs(p.y)));
}
// Distance to line segment between <a> and <b>, used for fCapsule() version 2below
float fLineSegment(vec3 p, vec3 a, vec3 b) {
vec3 ab = b - a;
float t = clamp( dot(p - a, ab) / dot(ab, ab), 0., 1. );
return length((ab*t + a) - p);
}
// Capsule version 2: between two end points <a> and <b> with radius r
float fCapsule(vec3 p, vec3 a, vec3 b, float r) {
return fLineSegment(p, a, b) - r;
}
// Torus in the XZ-plane
float fTorus(vec3 p, float smallRadius, float largeRadius) {
return length(vec2(length(p.xz) - largeRadius, p.y)) - smallRadius;
}
// A circle line. Can also be used to make a torus by subtracting the smaller radius of the torus.
float fCircle(vec3 p, float r) {
float l = length(p.xz) - r;
return length(vec2(p.y, l));
}
// A circular disc with no thickness (i.e. a cylinder with no height).
// Subtract some value to make a flat disc with rounded edge.
float fDisc(vec3 p, float r) {
float l = length(p.xz) - r;
return l < 0. ? abs(p.y) : length(vec2(p.y, l));
}
// Hexagonal prism, circumcircle variant
float fHexagonCircumcircle(vec3 p, vec2 h) {
vec3 q = abs(p);
return max(q.y - h.y, max(q.x*sqrt(3.)*0.5 + q.z*0.5, q.z) - h.x);
//this is mathematically equivalent to this line, but less efficient:
//return max(q.y - h.y, max(dot(vec2(cos(PI/3), sin(PI/3)), q.zx), q.z) - h.x);
}
// Hexagonal prism, incircle variant
float fHexagonIncircle(vec3 p, vec2 h) {
return fHexagonCircumcircle(p, vec2(h.x*sqrt(3.)*0.5, h.y));
}
// Cone with correct distances to tip and base circle. Y is up, 0 is in the middle of the base.
float fCone(vec3 p, float radius, float height) {
vec2 q = vec2(length(p.xz), p.y);
vec2 tip = q - vec2(0, height);
vec2 mantleDir = normalize(vec2(height, radius));
float mantle = dot(tip, mantleDir);
float d = max(mantle, -q.y);
float projected = dot(tip, vec2(mantleDir.y, -mantleDir.x));
// distance to tip
if ((q.y > height) && (projected < 0.)) {
d = max(d, length(tip));
}
// distance to base ring
if ((q.x > radius) && (projected > length(vec2(height, radius)))) {
d = max(d, length(q - vec2(radius, 0)));
}
return d;
}
////////////////////////////////////////////////////////////////
//
// DOMAIN MANIPULATION OPERATORS
//
////////////////////////////////////////////////////////////////
//
// Conventions:
//
// Everything that modifies the domain is named pSomething.
//
// Many operate only on a subset of the three dimensions. For those,
// you must choose the dimensions that you want manipulated
// by supplying e.g. <p.x> or <p.zx>
//
// <inout p> is always the first argument and modified in place.
//
// Many of the operators partition space into cells. An identifier
// or cell index is returned, if possible. This return value is
// intended to be optionally used e.g. as a random seed to change
// parameters of the distance functions inside the cells.
//
// Unless stated otherwise, for cell index 0, <p> is unchanged and cells
// are centered on the origin so objects don't have to be moved to fit.
//
//
////////////////////////////////////////////////////////////////
// Rotate around a coordinate axis (i.e. in a plane perpendicular to that axis) by angle <a>.
// Read like this: R(p.xz, a) rotates "x towards z".
// This is fast if <a> is a compile-time constant and slower (but still practical) if not.
void pR(inout vec2 p, float a) {
p = cos(a)*p + sin(a)*vec2(p.y, -p.x);
}
// Shortcut for 45-degrees rotation
void pR45(inout vec2 p) {
p = (p + vec2(p.y, -p.x))*sqrt(0.5);
}
// Repeat space along one axis. Use like this to repeat along the x axis:
// <float cell = pMod1(p.x,5);> - using the return value is optional.
float pMod1(inout float p, float size) {
float halfsize = size*0.5;
float c = floor((p + halfsize)/size);
p = mod(p + halfsize, size) - halfsize;
return c;
}
// Same, but mirror every second cell so they match at the boundaries
float pModMirror1(inout float p, float size) {
float halfsize = size*0.5;
float c = floor((p + halfsize)/size);
p = mod(p + halfsize,size) - halfsize;
p *= mod(c, 2.0)*2. - 1.;
return c;
}
// Repeat the domain only in positive direction. Everything in the negative half-space is unchanged.
float pModSingle1(inout float p, float size) {
float halfsize = size*0.5;
float c = floor((p + halfsize)/size);
if (p >= 0.)
p = mod(p + halfsize, size) - halfsize;
return c;
}
// Repeat only a few times: from indices <start> to <stop> (similar to above, but more flexible)
float pModInterval1(inout float p, float size, float start, float stop) {
float halfsize = size*0.5;
float c = floor((p + halfsize)/size);
p = mod(p+halfsize, size) - halfsize;
if (c > stop) { //yes, this might not be the best thing numerically.
p += size*(c - stop);
c = stop;
}
if (c <start) {
p += size*(c - start);
c = start;
}
return c;
}
// Repeat around the origin by a fixed angle.
// For easier use, num of repetitions is use to specify the angle.
float pModPolar(inout vec2 p, float repetitions) {
float angle = 2.*PI/repetitions;
float a = atan(p.y, p.x) + angle/2.;
float r = length(p);
float c = floor(a/angle);
a = mod(a,angle) - angle/2.;
p = vec2(cos(a), sin(a))*r;
// For an odd number of repetitions, fix cell index of the cell in -x direction
// (cell index would be e.g. -5 and 5 in the two halves of the cell):
if (abs(c) >= (repetitions/2.)) c = abs(c);
return c;
}
// Repeat in two dimensions
vec2 pMod2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size*0.5)/size);
p = mod(p + size*0.5,size) - size*0.5;
return c;
}
// Same, but mirror every second cell so all boundaries match
vec2 pModMirror2(inout vec2 p, vec2 size) {
vec2 halfsize = size*0.5;
vec2 c = floor((p + halfsize)/size);
p = mod(p + halfsize, size) - halfsize;
p *= mod(c,vec2(2.))*2. - vec2(1);
return c;
}
// Same, but mirror every second cell at the diagonal as well
vec2 pModGrid2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size*0.5)/size);
p = mod(p + size*0.5, size) - size*0.5;
p *= mod(c,vec2(2.))*2. - vec2(1.);
p -= size/2.;
if (p.x > p.y) p.xy = p.yx;
return floor(c/2.);
}
// Repeat in three dimensions
vec3 pMod3(inout vec3 p, vec3 size) {
vec3 c = floor((p + size*0.5)/size);
p = mod(p + size*0.5, size) - size*0.5;
return c;
}
// Mirror at an axis-aligned plane which is at a specified distance <dist> from the origin.
float pMirror (inout float p, float dist) {
float s = sgn(p);
p = abs(p)-dist;
return s;
}
// Mirror in both dimensions and at the diagonal, yielding one eighth of the space.
// translate by dist before mirroring.
vec2 pMirrorOctant (inout vec2 p, vec2 dist) {
vec2 s = sgn(p);
pMirror(p.x, dist.x);
pMirror(p.y, dist.y);
if (p.y > p.x)
p.xy = p.yx;
return s;
}
// Reflect space at a plane
float pReflect(inout vec3 p, vec3 planeNormal, float offset) {
float t = dot(p, planeNormal)+offset;
if (t < 0.) {
p = p - (2.*t)*planeNormal;
}
return sgn(t);
}
////////////////////////////////////////////////////////////////
//
// OBJECT COMBINATION OPERATORS
//
////////////////////////////////////////////////////////////////
//
// We usually need the following boolean operators to combine two objects:
// Union: OR(a,b)
// Intersection: AND(a,b)
// Difference: AND(a,!b)
// (a and b being the distances to the objects).
//
// The trivial implementations are min(a,b) for union, max(a,b) for intersection
// and max(a,-b) for difference. To combine objects in more interesting ways to
// produce rounded edges, chamfers, stairs, etc. instead of plain sharp edges we
// can use combination operators. It is common to use some kind of "smooth minimum"
// instead of min(), but we don't like that because it does not preserve Lipschitz
// continuity in many cases.
//
// Naming convention: since they return a distance, they are called fOpSomething.
// The different flavours usually implement all the boolean operators above
// and are called fOpUnionRound, fOpIntersectionRound, etc.
//
// The basic idea: Assume the object surfaces intersect at a right angle. The two
// distances <a> and <b> constitute a new local two-dimensional coordinate system
// with the actual intersection as the origin. In this coordinate system, we can
// evaluate any 2D distance function we want in order to shape the edge.
//
// The operators below are just those that we found useful or interesting and should
// be seen as examples. There are infinitely more possible operators.
//
// They are designed to actually produce correct distances or distance bounds, unlike
// popular "smooth minimum" operators, on the condition that the gradients of the two
// SDFs are at right angles. When they are off by more than 30 degrees or so, the
// Lipschitz condition will no longer hold (i.e. you might get artifacts). The worst
// case is parallel surfaces that are close to each other.
//
// Most have a float argument <r> to specify the radius of the feature they represent.
// This should be much smaller than the object size.
//
// Some of them have checks like "if ((-a < r) && (-b < r))" that restrict
// their influence (and computation cost) to a certain area. You might
// want to lift that restriction or enforce it. We have left it as comments
// in some cases.
//
// usage example:
//
// float fTwoBoxes(vec3 p) {
// float box0 = fBox(p, vec3(1));
// float box1 = fBox(p-vec3(1), vec3(1));
// return fOpUnionChamfer(box0, box1, 0.2);
// }
//
////////////////////////////////////////////////////////////////
// The "Chamfer" flavour makes a 45-degree chamfered edge (the diagonal of a square of size <r>):
float fOpUnionChamfer(float a, float b, float r) {
return min(min(a, b), (a - r + b)*sqrt(0.5));
}
// Intersection has to deal with what is normally the inside of the resulting object
// when using union, which we normally don't care about too much. Thus, intersection
// implementations sometimes differ from union implementations.
float fOpIntersectionChamfer(float a, float b, float r) {
return max(max(a, b), (a + r + b)*sqrt(0.5));
}
// Difference can be built from Intersection or Union:
float fOpDifferenceChamfer (float a, float b, float r) {
return fOpIntersectionChamfer(a, -b, r);
}
// The "Round" variant uses a quarter-circle to join the two objects smoothly:
float fOpUnionRound(float a, float b, float r) {
vec2 u = max(vec2(r - a,r - b), vec2(0));
return max(r, min (a, b)) - length(u);
}
float fOpIntersectionRound(float a, float b, float r) {
vec2 u = max(vec2(r + a,r + b), vec2(0));
return min(-r, max (a, b)) + length(u);
}
float fOpDifferenceRound (float a, float b, float r) {
return fOpIntersectionRound(a, -b, r);
}
// The "Columns" flavour makes n-1 circular columns at a 45 degree angle:
float fOpUnionColumns(float a, float b, float r, float n) {
if ((a < r) && (b < r)) {
vec2 p = vec2(a, b);
float columnradius = r*sqrt(2.)/((n-1.)*2.+sqrt(2.));
pR45(p);
p.x -= sqrt(2.)/2.*r;
p.x += columnradius*sqrt(2.);
if (mod(n,2.) == 1.) {
p.y += columnradius;
}
// At this point, we have turned 45 degrees and moved at a point on the
// diagonal that we want to place the columns on.
// Now, repeat the domain along this direction and place a circle.
pMod1(p.y, columnradius*2.);
float result = length(p) - columnradius;
result = min(result, p.x);
result = min(result, a);
return min(result, b);
} else {
return min(a, b);
}
}
float fOpDifferenceColumns(float a, float b, float r, float n) {
a = -a;
float m = min(a, b);
//avoid the expensive computation where not needed (produces discontinuity though)
if ((a < r) && (b < r)) {
vec2 p = vec2(a, b);
float columnradius = r*sqrt(2.)/n/2.0;
columnradius = r*sqrt(2.)/((n-1.)*2.+sqrt(2.));
pR45(p);
p.y += columnradius;
p.x -= sqrt(2.)/2.*r;
p.x += -columnradius*sqrt(2.)/2.;
if (mod(n,2.) == 1.) {
p.y += columnradius;
}
pMod1(p.y,columnradius*2.);
float result = -length(p) + columnradius;
result = max(result, p.x);
result = min(result, a);
return -min(result, b);
} else {
return -m;
}
}
float fOpIntersectionColumns(float a, float b, float r, float n) {
return fOpDifferenceColumns(a,-b,r, n);
}
// The "Stairs" flavour produces n-1 steps of a staircase:
// much less stupid version by paniq
float fOpUnionStairs(float a, float b, float r, float n) {
float s = r/n;
float u = b-r;
return min(min(a,b), 0.5 * (u + a + abs ((mod (u - a + s, 2. * s)) - s)));
}
// We can just call Union since stairs are symmetric.
float fOpIntersectionStairs(float a, float b, float r, float n) {
return -fOpUnionStairs(-a, -b, r, n);
}
float fOpDifferenceStairs(float a, float b, float r, float n) {
return -fOpUnionStairs(-a, b, r, n);
}
// Similar to fOpUnionRound, but more lipschitz-y at acute angles
// (and less so at 90 degrees). Useful when fudging around too much
// by MediaMolecule, from Alex Evans' siggraph slides
float fOpUnionSoft(float a, float b, float r) {
float e = max(r - abs(a - b), 0.);
return min(a, b) - e*e*0.25/r;
}
// produces a cylindical pipe that runs along the intersection.
// No objects remain, only the pipe. This is not a boolean operator.
float fOpPipe(float a, float b, float r) {
return length(vec2(a, b)) - r;
}
// first object gets a v-shaped engraving where it intersect the second
float fOpEngrave(float a, float b, float r) {
return max(a, (a + r - abs(b))*sqrt(0.5));
}
// first object gets a capenter-style groove cut out
float fOpGroove(float a, float b, float ra, float rb) {
return max(a, min(a + ra, rb - abs(b)));
}
// first object gets a capenter-style tongue attached
float fOpTongue(float a, float b, float ra, float rb) {
return min(a, max(a - ra, abs(b) - rb));
}
//#endSection End of library
// https://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl
// golden_noise
float noise(in vec2 xy, in float seed){
return fract(tan(distance(xy*PHI, xy)*seed)*xy.x);
}
vec3 rnd23(vec2 p)
{
vec3 p3 = fract(p.xyx * vec3(.1031, .1030, .0973));
p3 += dot(p3, p3.yxz+33.33);
return fract((p3.xxy+p3.yzz)*p3.zyx);
}
mat2 Rot(float a) {
float s=sin(a), c=cos(a);
return mat2(c, -s, s, c);
}
float opExtrusion( in vec3 p, in float sdf, in float h )
{
vec2 w = vec2( sdf, abs(p.z) - h);
return min(max(w.x,w.y),0.0) + length(max(w,0.0));
}
float sdCog2d(vec2 pos) {
float r = length(pos)*2.;
float a = atan(pos.y,pos.x);
float f = 1. - smoothstep(-0.2, .8, sin(a * 12.))*0.14;
f = smoothstep(f,f + 2.,r);
return f;
}
float sdCog(vec3 pos, float angle) {
pos.xy *= Rot(angle);
float d1 = opExtrusion(pos, sdCog2d(pos.xy), 0.05);
float d2 = fCapsule(pos, vec3(0., 0.0, 0.), vec3(0., 0., 1.), 0.2);
return 0.8 * fOpDifferenceRound(d1,d2,0.05)-0.003;}
float sdHex(vec3 pos, float i, float angle) {
vec3 po = pos;
po.xz *= Rot(angle);
po.yz *= Rot(angle);
pR(po.yz, PI/2.);
float d1 = fHexagonCircumcircle(po, vec2(0.5+i, .1));
float d2 = fHexagonCircumcircle(po, vec2(0.2+i, .1));
return fOpDifferenceRound(d1,d2,0.1);
}
// Scene
vec2 mapScene(in vec3 p) {
float mat = 0.;
float d = 1e10;
//float dGround = p.y + 2.5;
//d = min(d, dGround);
vec3 po = p;
//po.y += sin(u_time);
// pMod3(po, vec3(3.));
po.xy *= scale(vec2(1.3, 1.3));
const float num = 6.;
for (float i = 1.; i <= num; i++) {
// pos.z += i*.1;
float a = sdHex(po,i*0.35, u_time + abs( 2. + 0.4 * sin(u_time)) * i*3.1415/num);
d = min(d,a);
if (d == a) mat = 1. + mod(i,3.);
}
/*float c2 = sdCog(p, u_time);
d = min(d, c2);
if ( d == c2) mat = 4.;
*/
// float c3 = fBox(p+vec3(0.5, .87, 0.), vec3(1., 1.,1.));
// d = min(d, c3);
// if ( d == c1) mat = 1.;
//if ( d == c3) mat = 3.;
return vec2(d, mat);
}
vec3 castRay(vec3 ro, vec3 rd, inout vec3 pos) {
float t = 0.0;
float mat = 0.;
float hit = 0.;
for(int i=0; i < 150; i++) {
pos = ro + rd * t;
vec2 res = mapScene(pos);
t += res.x;
mat = res.y;
if (t > 80.) break;
if (res.x < abs(0.001*t) ) {
hit = 1.;
break;
}
}
if (t > 80.) t = -1.0;
return vec3(t, mat, hit);
}
vec3 castReflectedRay(vec3 ro, vec3 rd, vec3 pos) {
float t = 0.0;
float mat = 0.;
float hit = 0.;
for(int i=0; i < 50; i++) {
pos = ro + rd * t;
vec2 res = mapScene(pos);
t += res.x;
mat = res.y;
if (t > 40.) break;
if (res.x < abs(0.001*t) ) {
hit = 1.;
break;
}
}
if (t > 40.) t = -1.0;
return vec3(t, mat, hit);
}
float softshadow( in vec3 ro, in vec3 rd, float mint, float maxt, float w )
{
float res = 1.0;
float t = mint;
for( int i=0; i<40; i++ )
{
if (t > maxt) break;
float h = mapScene(ro + t*rd).x;
res = min( res, h/(w*t) );
t += clamp(h, 0.005, 0.50);
if( res < -1.0 || t>maxt ) break;
}
res = max(res,-1.0);
return 0.25*(1.0+res)*(1.0+res)*(2.0-res);
}
float castShadow(vec3 ro, vec3 rd) {
float res = 1.0;
float t = 0.001;
for(int i = 0; i < 40; i++) {
float h = mapScene(ro + t* rd).x;
res = min(res, 10.0*h/t);
if (abs(h) < (0.001*t) ) break;
t += h;
if (t > 20.) break;
}
return clamp(res,0., 1.);
}
vec3 calcNormal(vec3 pos) {
vec2 e = vec2(.001, 0.);
vec3 n = vec3( mapScene(pos+e.xyy).x - mapScene(pos-e.xyy).x,
mapScene(pos+e.yxy).x - mapScene(pos-e.yxy).x,
mapScene(pos+e.yyx).x - mapScene(pos-e.yyx).x
);
return normalize(n);
}
vec3 fresnel( vec3 F0, vec3 h, vec3 l ) {
return F0 + ( 1.0 - F0 ) * pow( clamp( 1.0 - dot( h, l ), 0.0, 1.0 ), 5.0 );
}
// https://suricrasia.online/blog/shader-functions/
vec3 eRot(vec3 p, vec3 ax, float ro) {
return mix(dot(ax,p)*ax, p, cos(ro)) + sin(ro)*cross(ax,p);
}
vec3 addPointLight(vec3 light_pos, vec3 light_color, float shininess, vec3 v, vec3 dir, vec3 n, float occ) {
vec3 Ks = vec3( .5454 );
vec3 Kd = vec3( 1. );
vec3 ref = reflect( dir, n );
vec3 vl = normalize( v );
vec3 diffuse = Kd * vec3( max( 0.0, dot( vl, n ) ) );
vec3 specular = vec3( max( 0.0, dot( vl, ref ) ) );
vec3 F = fresnel( Ks, normalize( vl - dir ), vl )*occ;
float shadow = softshadow(v+n*0.01,light_pos, .01, 30., 18.);
//float shadow = castShadow(v + n*0.02, light_pos);
specular = pow( specular, vec3( shininess ) )*occ;
return light_color * mix( diffuse, specular, F ) * shadow;
}
float getAmbientOcc(vec3 p, vec3 n) {
float occ = 0.;
float weight = 1.;
for (int i = 0; i < 8; i++) {
float len = 0.01 + 0.02 * float(i*i);
float dist = mapScene(p+n*len).x;
occ += (len - dist) * weight;
weight *=0.85;
}
return 1.0 - clamp(0.6 * occ, 0., 1.);
}
vec3 shading(vec3 v, vec3 n, vec3 dir, float material) {
float shininess = 1.;
float occ = getAmbientOcc(v,n);
vec3 outMaterial = vec3(0.1529, 0.1529, 0.1529);
if (material == 0.) {
outMaterial = vec3(0.2863, 0.1059, 0.2431);
shininess = 1.5;
} else if (material == 1.) {
outMaterial = vec3(0.3294, 0.0941, 0.6);
shininess = 0.6;
} else if (material == 2.) {
outMaterial = vec3(0.5804, 0.9647, 1.0);
shininess = 1.;
} else if (material == 3.) {
outMaterial = vec3(0.0, 0.0, 0.0);
shininess = 100.;
} else if (material == 4.) {
outMaterial = vec3(0.9961, 1.0, 0.9922);
shininess = .3;
}
vec3 lights = vec3(0.);
lights += addPointLight(vec3( 0., -40., -1. ),vec3(0.56, 0.44, 0.18)*2., shininess, v, dir, n, occ);
lights += addPointLight(vec3( -20.,4., 10. ),vec3(0.04, 0.2, 0.71)*2., shininess, v, dir, n, occ);
// lights += addPointLight(vec3( 2., -1.0, -1.0 ),vec3(0.12, 0.51, 0.63)*2., shininess, v,dir,n,occ );
vec3 lightDir = vec3(0. , 4., 2.);
float sun_dif = clamp(dot(n, lightDir), 0., 1.);
float shadow = softshadow(v+n*0.01,lightDir, .01, 30., 18.);
lights += vec3(0.6627, 0.7098, 0.8863) * sun_dif*shadow*occ; //* shadow; //* mix( vec3(sun_dif), specular, F )
// final += texture( iChannel0, ref ).rgb * fresnel( Ks, n, -dir );
// vec3 col = vec3(0.4)* ref.x;
float ind = clamp( dot( n, normalize(lightDir*vec3(-1.0,.0,-1.0)) ), 0.0, 1.0 );
lights += vec3(0.1333, 0.1333, 0.1216) * ind *occ;
return outMaterial * max(vec3(0.), lights);
}
vec3 postProcess(vec3 col) {
// float random = noise(gl_FragCoord.xy, 0.01+u_time);
// float random2 = noise(gl_FragCoord.xy, .2+u_time);
//col += 0.075*clamp(vec3(0.5*random, 0.5*random2, 0.5*random), 0.02, 1.); // dither
// Normalized pixel coordinates (from 0 to 1)
vec2 screenCoord = gl_FragCoord.xy/u_resolution.xy;
// Vignette
float radius = 0.8;
float d = smoothstep(radius, radius-0.4, length(screenCoord-vec2(0.5)));
col = mix(col, col * d, .9);
// Contrast
float constrast = .5;
col = mix(col, smoothstep(0.0, 1.0, col), constrast);
// Colour mapping
col *= vec3(1.0, 1.0, 1.0);
col = pow( col, vec3(1.0/2.2) ); // gamma
// fade in at the beginning
//col*=vec3(clamp((u_time-1.8)*0.5,0., 1.));
// fade out at the end
// col*=vec3(clamp((120.-u_time)*.35, 0., 1.));
return col;
}
vec3 getCameraRayDir(vec2 uv, vec3 camPos, vec3 camTarget)
{
// Calculate camera's "orthonormal basis", i.e. its transform matrix components
vec3 camForward = normalize(camTarget-camPos );
vec3 camRight = normalize(cross(vec3(.0, 1.0, 0.0), camForward));
vec3 camUp = normalize(cross(camForward, camRight));
float fov = 0.7;
vec3 vDir = normalize(uv.x * camRight + uv.y * camUp + camForward * fov);
return vDir;
}
vec3 getCameraRayDir2(vec2 uv, vec3 camPos, vec3 lookAt, float zoom){
vec3 f = normalize(lookAt - camPos);
vec3 r = cross(vec3(0.0,1.0,0.0),f);
vec3 u = cross(f,r);
vec3 c=camPos+f*zoom;
vec3 i=c+uv.x*r+uv.y*u;
return normalize(i-camPos);
}
vec3 getCameraFov(vec2 uv, vec3 camPos, vec3 camTarget) {
vec3 camForward = normalize(camTarget-camPos);
vec3 camRight = normalize(cross(vec3(0.0, 1.0, 0.0), camForward));
vec3 camUp = normalize(cross(camForward,camRight));
float fov = 1.7;
// Depth of field
float dof = .25;
vec2 h = vec2( noise(gl_FragCoord.xy, .13), noise(gl_FragCoord.xy, .4));
//vec3 h= rnd23(gl_FragCoord.xy);
vec3 voff = sqrt(h.x)*(camRight*sin(h.y*6.283)+camUp*cos(h.y*6.283))*dof;
// camTarget -=voff;
float focusdistance = 150.2;
return normalize(uv.x * camRight + uv.y * camUp + fov * camForward + voff * fov/focusdistance);
}
vec3 applyFog(vec3 col, float t, vec3 rd, vec3 lightDir, float b ) {
float fogAmount = 1.0 - exp(-t*b);
float sunAmount = max( dot(rd, lightDir), 0.0 );
vec3 fogColor = mix( vec3(0.3686, 0.2431, 0.4392), // blue
vec3(0.4, 0.7294, 0.9216), // yellow
pow(sunAmount,8.0) );
return mix( col, fogColor, fogAmount );
}
vec3 render(vec2 uv) {
bool useDof = !true;
//vec2 uv = (2.0 * gl_FragCoord.xy - u_resolution.xy) / u_resolution.y;
float angle = -2.4 +u_time*0.4;
//angle = 0.;
// camera
vec3 camPos = vec3(0., 5., -3.);
vec3 camTarget = vec3(0., 0., 0.);
vec3 rayDir;
if (useDof) {
rayDir = getCameraFov(uv, camPos, camTarget);
} else {
rayDir = getCameraRayDir2(uv, camPos, camTarget, 1.0);
}
vec3 col = vec3(0.051, 0.0667, 0.1529);
//vec3 col = vec3(0.0314, 0.0118, 0.1255) + rayDir.y * 0.4;
vec3 hitPos = vec3(0.);
vec3 t = castRay(camPos, rayDir, hitPos);
vec3 rd = rayDir;
if (t.z > 0.) {
vec3 nor = calcNormal(hitPos);
col = shading(hitPos, nor, rayDir , t.y);
float fogAmount = 0.04;
col = col*exp(-t.x*fogAmount) + applyFog(col, t.x, rd, vec3(0., .3, -1.), fogAmount) * (1.0-exp(-t.x*fogAmount));
rayDir = normalize(reflect(rayDir, nor));
vec3 rayOrigin = hitPos + (rayDir * 0.01);
vec3 t2 = castReflectedRay(rayOrigin, rayDir, hitPos);
if (t2.z > 0.) {
hitPos = rayOrigin + rayDir * t2.x;
nor = calcNormal(hitPos);
col += 0.1 * shading(hitPos, nor, rayDir , t2.y);
/* rayDir = normalize(reflect(rayDir, nor));
rayOrigin = hitPos + (rayDir * 0.01);
vec3 t3 = castReflectedRay(rayOrigin, rayDir, hitPos);
if (t3.z > 0.) {
hitPos = rayOrigin + rayDir * t3.x;
nor = calcNormal(hitPos);
col += 0.025 * shading(hitPos, nor, rayDir , t3.y);
} */
}
}
// pixelColor*exp(-distance*b) + fogColor*(1.0-exp(-distance*b));
return col;
}
vec2 getUV(vec2 offset) {
vec2 uv = 2.0 *((gl_FragCoord.xy + offset*0.5)/u_resolution.xy - 0.5);
uv.x *= u_resolution.x/u_resolution.y; // Correct for aspect ratio
return uv;
}
void main()
{
vec3 finalColor = vec3(0.);
const float AA_SIZE = 1.;
float count = 0.0;
/*
for (float aaY = 0.0; aaY < AA_SIZE; aaY++) {
for (float aaX = 0.0; aaX < AA_SIZE; aaX++) {
finalColor += render(getUV(vec2( aaX, aaY)));
count += 1.0;
}
}
finalColor /= count; */
finalColor += render(getUV(vec2( 0.,0.)));
finalColor = postProcess(finalColor);
gl_FragColor = vec4(finalColor, 1.);
}

110
test.glsl Normal file
View File

@ -0,0 +1,110 @@
precision mediump float;
uniform vec2 u_resolution;
uniform float u_time;
float uIorR = 1.0;
float uIorY = 1.0;
float uIorG = 1.0;
float uIorC = 1.0;
float uIorB = 1.0;
float uIorP = 1.0;
float uSaturation = 0.0;
float uChromaticAberration = 1.0;
float uRefractPower = 0.2;
float uFresnelPower = 8.;
float uShininess = 15.;
float uDiffuseness = 0.2;
vec3 uLight = vec3(-1., 0., 1.);
uniform sampler2D uTexture;
vec3 worldNormal = vec3(0., 0., 1.);
vec3 eyeVector = vec3(0., 0., 0.);
vec3 sat(vec3 rgb, float adjustment) {
const vec3 W = vec3(0.2125, 0.7154, 0.0721);
vec3 intensity = vec3(dot(rgb, W));
return mix(intensity, rgb, adjustment);
}
float fresnel(vec3 eyeVector, vec3 worldNormal, float power) {
float fresnelFactor = abs(dot(eyeVector, worldNormal));
float inversefresnelFactor = 1.0 - fresnelFactor;
return pow(inversefresnelFactor, power);
}
float specular(vec3 light, float shininess, float diffuseness) {
vec3 normal = worldNormal;
vec3 lightVector = normalize(-light);
vec3 halfVector = normalize(eyeVector + lightVector);
float NdotL = dot(normal, lightVector);
float NdotH = dot(normal, halfVector);
float kDiffuse = max(0.0, NdotL);
float NdotH2 = NdotH * NdotH;
float kSpecular = pow(NdotH2, shininess);
return kSpecular + kDiffuse * diffuseness;
}
const int LOOP = 16;
void main() {
vec2 uv = gl_FragCoord.xy / u_resolution.xy;
vec3 normal = worldNormal;
vec3 color = vec3(0.0);
for ( int i = 0; i < LOOP; i ++ ) {
float slide = float(i) / float(LOOP) * 0.1;
vec3 refractVecR = refract(eyeVector, normal,(1.0/uIorR));
vec3 refractVecY = refract(eyeVector, normal, (1.0/uIorY));
vec3 refractVecG = refract(eyeVector, normal, (1.0/uIorG));
vec3 refractVecC = refract(eyeVector, normal, (1.0/uIorC));
vec3 refractVecB = refract(eyeVector, normal, (1.0/uIorB));
vec3 refractVecP = refract(eyeVector, normal, (1.0/uIorP));
float r = texture2D(uTexture, uv + refractVecR.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).x * 0.5;
float y = (texture2D(uTexture, uv + refractVecY.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).x * 2.0 +
texture2D(uTexture, uv + refractVecY.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).y * 2.0 -
texture2D(uTexture, uv + refractVecY.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).z) / 6.0;
float g = texture2D(uTexture, uv + refractVecG.xy * (uRefractPower + slide * 2.0) * uChromaticAberration).y * 0.5;
float c = (texture2D(uTexture, uv + refractVecC.xy * (uRefractPower + slide * 2.5) * uChromaticAberration).y * 2.0 +
texture2D(uTexture, uv + refractVecC.xy * (uRefractPower + slide * 2.5) * uChromaticAberration).z * 2.0 -
texture2D(uTexture, uv + refractVecC.xy * (uRefractPower + slide * 2.5) * uChromaticAberration).x) / 6.0;
float b = texture2D(uTexture, uv + refractVecB.xy * (uRefractPower + slide * 3.0) * uChromaticAberration).z * 0.5;
float p = (texture2D(uTexture, uv + refractVecP.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).z * 2.0 +
texture2D(uTexture, uv + refractVecP.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).x * 2.0 -
texture2D(uTexture, uv + refractVecP.xy * (uRefractPower + slide * 1.0) * uChromaticAberration).y) / 6.0;
float R = r + (2.0*p + 2.0*y - c)/3.0;
float G = g + (2.0*y + 2.0*c - p)/3.0;
float B = b + (2.0*c + 2.0*p - y)/3.0;
color.r += R;
color.g += G;
color.b += B;
color = sat(color, uSaturation);
}
// Divide by the number of layers to normalize colors (rgb values can be worth up to the value of LOOP)
color /= float( LOOP );
// Specular
float specularLight = specular(uLight, uShininess, uDiffuseness);
color += specularLight;
// Fresnel
float f = fresnel(eyeVector, normal, uFresnelPower);
color.rgb += f * vec3(1.0);
gl_FragColor = vec4(color, 1.0);
}