/* $eterna: pacific_greens-midi.h,v 1.19 2016/06/04 22:56:25 mrg Exp $ */ /* * Copyright (c) 2016 Matthew R. Green * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef MRG_MIDI_PACIFIC_GREENS_MIDI_H #define MRG_MIDI_PACIFIC_GREENS_MIDI_H /* midi stuff for "pacific greens" */ /* */ #define NOTES_PER_BEAT (4) #define BEATS_PER_BAR (4) #define NUM_TRACKS (1) #define TEMPO (80) #include "mrg_midi_format.h" #include "mrg_midi_msg.h" /* * main bass (*b1) */ // don't fuck with the volume here; do it externally. works better #define MB_QST(v) #define MB_QEN(m1,m2) \ PBH, CCMOD(m1), PBH, CCMOD(m2) /* one/two/four bar's worth */ #define MB_B(m1,m2) \ PB2, CCMOD(m1), PB2, CCMOD(m2) #define MB_2B(m1,m2,m3,m4) \ MB_B(m1,m2), MB_B(m3,m4) #define MB_4B(m1,m2,m3,m4,m5,m6,m7,m8) \ MB_2B(m1,m2,m3,m4), MB_2B(m5,m6,m7,m8) /* 1/2/4 bar up/down. make sure you don't overflow it! */ #define MB_1B_U(m1,i) \ MB_B(m1+(i*0),m1+(i*1)) #define MB_2B_U(m1,i) \ MB_1B_U(m1,i), MB_1B_U(m1+(i*2),i) #define MB_4B_U(m1,i) \ MB_2B_U(m1,i), MB_2B_U(m1+(i*4),i) #define MB_1B_D(m1,i) \ MB_B(m1-(i*0),m1-(i*1)) #define MB_2B_D(m1,i) \ MB_1B_D(m1,i), MB_1B_D(m1-(i*2),i) #define MB_4B_D(m1,i) \ MB_2B_D(m1,i), MB_2B_D(m1-(i*4),i) #define MB_Q(v,m1,m2) \ MB_QST(v) MB_QEN(m1, m2) #define MB_QP1(v,m1,m2,p1) \ MB_QST(v) p1, MB_QEN(m1, m2) #define MB_QP2(v,m1,m2,p1,p2) \ MB_QST(v) p1, p2, MB_QEN(m1, m2) #define B1INTRO /* P8,P4 */ \ /* b001 */ \ CCMOD(8), \ MB_QP2(8, 32, 64, PMPON(A2,0,30), PMPON(E3,0,30)), \ MB_QP2(12, 96, 127, PPAT(A2,0,45), PPAT(E3,0,45)), \ MB_QP2(16, 96, 6, PPAT(A2,0,60), PPAT(E3,0,60)), \ MB_Q(20, 40, 70), \ MB_QP2(24, 77, 80, PMPON(A3,0,30), PMPON(E4,0,30)), \ MB_QP2(28, 90, 4, PPAT(A3,0,35), PPAT(E4,0,35)), \ MB_QP2(32, 40, 44, PPAT(A3,0,40), PPAT(E4,0,40)), \ MB_QP2(36, 48, 50, PPAT(A3,0,45), PPAT(E4,0,45)), \ /* b003 */ \ MB_Q(40, 51, 54), \ MB_QP2(44, 57, 60, PPAT(A3,0,50), PPAT(E4,0,50)), \ MB_Q(48, 70, 80), \ MB_QP2(52, 90, 100, PPAT(A3,0,55), PPAT(E4,0,55)), \ MB_Q(56, 110, 120), \ MB_QP2(60, 127, 125, PPAT(A3,0,60), PPAT(E4,0,60)), \ MB_Q(64, 123, 121), \ MB_Q(68, 120, 120), \ /* b005 */ \ MB_Q(72, 40, 39), \ MB_Q(76, 38, 37), \ PPAT(A2,0,70), PPAT(E3,0,70), \ MB_Q(80, 20, 10), \ MB_Q(84, 0, 10), \ PPAT(A2,0,80), PPAT(E3,0,80), \ PPAT(A3,0,70), PPAT(E4,0,70), \ MB_Q(88, 20, 30), \ MB_Q(92, 40, 50), \ MB_Q(96, 60, 70), \ MB_Q(100, 80, 70), \ /* b007 */ \ PPAT(A2,0,90), PPAT(E3,0,90), \ PPAT(A3,0,80), PPAT(E4,0,80), \ MB_Q(104, 75, 70), \ MB_Q(108, 75, 70), \ MB_Q(112, 65, 70), \ MB_Q(116, 75, 70), \ PPAT(A3,0,90), PPAT(E4,0,90), \ MB_Q(120, 65, 75), \ MB_Q(124, 75, 80), \ MB_Q(127, 85, 90), \ MB_QEN(95, 100), \ /* b009 */ \ MB_QEN(105, 110), \ MB_QEN(115, 120), \ MB_QEN(125, 127), \ MB_QEN(126, 125), \ MB_QEN(124, 123), \ MB_QEN(122, 121), \ MB_QEN(120, 119), \ MB_QEN(118, 117), \ /* b011 */ \ MB_QEN(117, 116), \ MB_QEN(115, 114), \ MB_QEN(113, 112), \ MB_QEN(111, 110), \ MB_QEN(109, 108), \ MB_QEN(107, 106), \ MB_QEN(105, 104), \ MB_QEN(103, 102) /* at this point A2, E3, A3, and E4 are on */ #define B1MAIN1 /* P8,P4 */ \ MB_4B_D(100,4), \ MB_4B_D(68,4), \ MB_4B_D(36,4) /* at this point A2, E3, A3, and E4 are on */ #define B1CHORUS1 /* P8,P8 */ \ MB_4B_U(0,6), \ MB_4B_U(48,6), \ MB_4B_U(96,3), \ PMOFF(A3,0), PMOFF(E4,0), \ MB_4B_D(127,5) /* at this point A2, and E3 are on */ #define B1MAIN2 /* P8,P4 */ \ MB_4B_U(50,7), \ MB_4B_D(127,7), \ MB_4B_D(70,7) /* at this point A2, and E3 are on */ #define B1CHORUS2 /* P8,P8 */ \ MB_4B_U(20,6), \ MB_4B_U(48,6), \ PMPON(A3,0,80), PMPON(E4,0,80), \ MB_4B_U(96,3), \ MB_4B_D(127,5) /* at this point A2, E3, A3, and E4 are still on */ #define B1END /* P8 */ \ PMOFF(B2,0), PMOFF(B3,0), \ MB_4B_D(87,5), \ MB_4B_D(47,5) /* * at this point A2, E3, A3, E4 are still on */ #define B1OUTRO /* P8 */ \ /* b077 */ \ MB_Q(125,40, 50), \ MB_Q(121,60, 70), \ MB_Q(117,80, 90), \ MB_Q(113,100,110), \ /* b078 */ \ MB_Q(109,120,127), \ MB_Q(105,120,100), \ MB_Q(101,80, 60), \ MB_Q(97, 40, 20), \ /* b079 */ \ MB_Q(93, 0, 5), \ MB_Q(89, 10, 15), \ MB_Q(85, 20, 25), \ MB_Q(81, 30, 35), \ /* b080 */ \ MB_Q(77, 40, 45), \ MB_Q(73, 50, 55), \ MB_Q(69, 60, 65), \ MB_Q(65, 70, 75), \ /* b081 */ \ MB_Q(61, 80, 85), \ MB_Q(57, 90, 95), \ MB_Q(53, 100,105), \ MB_Q(49, 110,105), \ /* b082 */ \ MB_Q(45, 120,125), \ MB_Q(41, 100,75), \ MB_Q(37, 50, 25), \ MB_Q(33, 0, 50), \ PMOFF(A3,0), PMOFF(E4,0), \ /* b083 */ \ MB_Q(29, 55, 60), \ MB_Q(25, 65, 70), \ MB_Q(21, 75, 80), \ MB_Q(17, 85, 90), \ /* b084 */ \ MB_Q(13, 40, 50), \ MB_Q(9, 40, 50), \ MB_Q(5, 40, 50), \ MB_Q(1, 40, 50), \ PMOFF(A2,0), PMOFF(E3,0), \ P4, \ CCMSG(0, MICROKORG_XL_ALL_SOUND_OFF, 0) static unsigned char bass_sample[] = { HDR, CCVOL(127), // b001-012 B1INTRO, // b013-024 B1MAIN1, // b025-040 B1CHORUS1, // b041-052 B1MAIN2, // b053-068 B1CHORUS2, // b069-076 B1END, // b077- B1OUTRO, P2, MRG_MIDI_TRAILER }; /* * *b1.high - higher notes separated from *b1 */ #define B1HINTRO /* P8,P4 */ \ P4, \ /* b005 */ \ PB, PMPON(D4,0,50), PB, PB2, \ PBH, PMOFF(D4,0), PMPON(Csh4,0,50), PBH, PB, PB2, \ PMOFF(Csh4,0), PMPON(B3,0,50), P1, \ PBH, PMOFF(B3,0), PMPON(Csh4,0,50), PBH, PB, PB2, \ /* b009 */ \ P1, \ PMOFF(Csh4,0), PMPON(D4,0,50), P1, \ PB, PMOFF(D4,0), PMPON(Csh4,0,80), PB, PB2, \ PBH, PMOFF(Csh4,0), PMPON(B3,0,80), PBH, PB, PB2 #define B1HMAIN1 /* P8,P4 */ \ /* b013 */ \ PMOFF(B3,0), \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ P4, \ /* b017 */ \ P1, \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(D4,0,80), PMPON(D3,0,80), \ P2, \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ PMOFF(D4,0), PMOFF(D3,0), \ P1, \ /* b021 */ \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(B3,0,80), PMPON(B4,0,80), \ P4 #define B1HCHORUS1 /* P8,P8 */ \ /* b025 */ \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ PMPON(A5,0,60), \ PMOFF(B3,0), PMOFF(B4,0), \ P4, \ /* b029 */ \ PMOFF(A5,0), \ PMPON(A5,0,60), \ PMPON(D4,0,70), PMPON(D3,0,70), \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ P4, \ /* b033 */ \ PMOFF(A5,0), \ PMPON(A5,0,60), \ PMPON(Csh4,0,70), PMPON(Csh3,0,70), \ PMOFF(D4,0), PMOFF(D3,0), \ P4, \ /* b037 */ \ PMOFF(A5,0), \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(B3,0,80), PMPON(B4,0,80), \ P4 #define B1HMAIN2 /* P8,P4 */ \ /* b041 */ \ PMOFF(B3,0), PMOFF(B4,0), \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ P4, \ /* b045 */ \ P1, \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(D4,0,80), PMPON(D3,0,80), \ P2, \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ PMOFF(D4,0), PMOFF(D3,0), \ P1, \ /* b049 */ \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(B3,0,80), PMPON(B4,0,80), \ P4 #define B1HCHORUS2 /* P8,P8 */ \ /* b053 */ \ PMOFF(B3,0), PMOFF(B4,0), \ PMPON(Csh4,0,70), PMPON(Csh3,0,70), \ PMPON(A5,0,60), \ P4, \ /* b057 */ \ PMPON(A5,0,70), \ PMOFF(A5,0), \ PMPON(D4,0,80), PMPON(D3,0,80), \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ P4, \ /* b061 */ \ PMPON(Csh4,0,80), PMPON(Csh3,0,80), \ PMOFF(D4,0), PMOFF(D3,0), \ P4, \ /* b065 */ \ PMOFF(Csh4,0), PMOFF(Csh3,0), \ PMPON(B3,0,80), PMPON(B4,0,80), \ P4 /* * put this starting quarter beat before it is wanted, so it ends * up starting when it is needed. (should be PBH intro, and no * PBQ trailer.) */ #define B1HEND_P1(p) /* P1 */ \ PBQ, PMPON(A4,0,p), \ PB, PMPON(B4,0,p), PMOFF(A4,0), \ PB, PBH, PMPON(Gsh4,0,p), PMOFF(B4,0), \ PB, PMOFF(Gsh4,0), PBQ #define B1HEND /* P8 */ \ PMOFF(B3,0), PMOFF(B4,0), \ PMOFF(A5,0), \ /* b069 */ \ B1HEND_P1(50), B1HEND_P1(60), \ B1HEND_P1(70), B1HEND_P1(80), \ /* b073 */ \ B1HEND_P1(90), B1HEND_P1(70), \ B1HEND_P1(60), B1HEND_P1(50) #define B1HOUTRO /* P8 */ \ /* b077 */ \ PMPON(A4,0,50), P1, PMOFF(A4,0), \ P1, P2, P4 static unsigned char basshigh_sample[] = { HDR, CCVOL(127), // b001-012 B1HINTRO, // b013-024 B1HMAIN1, // b025-040 B1HCHORUS1, // b041-052 B1HMAIN2, // b053-068 B1HCHORUS2, // b069-076 B1HEND, // b077- B1HOUTRO, CCMSG(0, MICROKORG_XL_ALL_SOUND_OFF, 0), MRG_MIDI_TRAILER }; /* * simple up and down synth melody (*s2) */ #define UD_NPBQ (NOTES_PER_BEAT/2) #define UD_VOL(n) (96 - ((n) - (A1))) #define UD_P3(n1,n2,n3) \ PMPX(n1,UD_NPBQ,NOTES_PER_BEAT,UD_VOL(n1),UD_VOL(n1)), \ PMPX(n2,UD_NPBQ,NOTES_PER_BEAT,UD_VOL(n1),UD_VOL(n1)), \ PMPX(n3,UD_NPBQ,UD_NPBQ,UD_VOL(n1),UD_VOL(n1)) #define UD_UP1 \ UD_P3(A1,B1,Csh2), \ UD_P3(D2,E2,Fsh2), \ UD_P3(G2,A2,B2), \ UD_P3(Csh3,D3,E3), \ /* 4 */ \ UD_P3(Fsh3,Gsh3,A3), \ UD_P3(B3,Csh4,D4), \ UD_P3(E4,Fsh4,Gsh4), \ UD_P3(A4,B4,Csh5), \ /* 8 */ \ UD_P3(D5,E5,Fsh5), \ UD_P3(Gsh5,A5,B5), \ UD_P3(Csh6,D6,E6), \ UD_P3(Fsh6,Gsh6,A6), \ /* 12 */ \ UD_P3(B6,Csh7,D7), \ UD_P3(E7,Fsh7,Gsh7), \ UD_P3(A7,B7,Csh8), \ UD_P3(D8,E8,Fsh8), \ /* 16 */ \ UD_P3(Gsh8,A8,B8), \ UD_P3(Csh9,D9,E9) \ /* 18 */ #define UD_DOWN1 \ UD_P3(Fsh9,E9,D9), \ UD_P3(Csh9,B8,A8), \ UD_P3(Gsh8,Fsh8,E8), \ UD_P3(D8,Csh8,B7), \ /* 4 */ \ UD_P3(A7,Gsh7,Fsh7), \ UD_P3(E7,D7,Csh7), \ UD_P3(B6,A6,Gsh6), \ UD_P3(Fsh6,E6,D6), \ /* 8 */ \ UD_P3(Csh6,B5,A5), \ UD_P3(Gsh5,Fsh5,E5), \ UD_P3(D5,Csh5,B4), \ UD_P3(A4,Gsh4,Fsh4), \ /* 12 */ \ UD_P3(E4,D4,Csh4), \ UD_P3(B3,A3,Gsh3), \ UD_P3(Fsh3,E3,D3), \ UD_P3(Csh3,B2,A2), \ /* 16 */ \ UD_P3(G2,Fsh2,E2), \ UD_P3(D2,Csh2,B1) \ /* 18 */ static unsigned char updownsynth_sample[] = { HDR, CCVOL(127), // b001-022 P4, UD_DOWN1, // b023-b040 UD_DOWN1, // b041-058 UD_UP1, // b059-b074 UD_DOWN1, P4, CCMSG(0, MICROKORG_XL_ALL_SOUND_OFF, 0), MRG_MIDI_TRAILER }; static unsigned char test_sample[] = { HDR, CCVOL(127), //P1, // b001-012 // b013-024 // b025-040 // b041-052 // b053-068 // b069-076 // b077- //PMPON(A3,0,90), PMPON(E4,0,90), //PMPON(A2,0,70), PMPON(E3,0,90), //PMPON(B3,0,80), PMPON(B2,0,80), \ //MB_4B_D(127,5), \ //B1MAIN2, B1INTRO, // 192 //B1MAIN1, // 192 //B1CHORUS1, // 256 //B1MAIN2, // 192 //B1CHORUS2, // 256 //B1END, // 128 //B1OUTRO, // 192 //B1HINTRO, // 192 //B1HMAIN1, // 192 //B1HCHORUS1, // 256 //B1HMAIN2, // 192 //B1HCHORUS2, // 256 //B1HEND, // 128 //B1HOUTRO, // 128 //UD_DOWN1, //P1, CCMSG(0, MICROKORG_XL_ALL_SOUND_OFF, 0), MRG_MIDI_TRAILER }; /* all the samples */ static midi_sample bass_eyes_midi_sample = { .name = "bass", .sample = bass_sample, .len = sizeof bass_sample, .func = NULL, }; static midi_sample basshigh_eyes_midi_sample = { .name = "basshigh", .sample = basshigh_sample, .len = sizeof basshigh_sample, .func = NULL, }; static midi_sample updownsynth_eyes_midi_sample = { .name = "updownsynth", .sample = updownsynth_sample, .len = sizeof updownsynth_sample, .func = NULL, }; static midi_sample test_eyes_midi_sample = { .name = "test", .sample = test_sample, .len = sizeof test_sample, .func = NULL, }; #define MRG_MIDI_SAMPLES \ &bass_eyes_midi_sample, \ &basshigh_eyes_midi_sample, \ &updownsynth_eyes_midi_sample, \ &test_eyes_midi_sample, #endif /* MRG_MIDI_PACIFIC_GREENS_MIDI_H */