├── .gitattributes ├── piano.m └── standardNote.mat /.gitattributes: -------------------------------------------------------------------------------- 1 | *.m linguist-language=MATLAB 2 | -------------------------------------------------------------------------------- /piano.m: -------------------------------------------------------------------------------- 1 | function piano 2 | [hFigure,y,Fs]=Init; 3 | audioPlayerCell=ConstructAudioPlayer(y,Fs);%audioPlayerCell{39} is standard C. 4 | hFigure.KeyPressFcn=@KeyPressFunction; 5 | hFigure.KeyReleaseFcn=@KeyReleaseFunction; 6 | key=[]; 7 | 8 | function [hFigure,y,Fs]=Init 9 | load standardNote.mat; 10 | screensize=get(0,'screensize'); 11 | hFigure=figure('position',[(screensize(3)-1196)/2 (screensize(4)-200)/2 1195 200],'toolbar','none','menubar','none','numbertitle','off','name','Piano Simulation'); 12 | hAxes=axes('parent',hFigure,'units','pixels','position',[0 0 1195 200]); 13 | axis off; 14 | axis([0 1195 0 200]); 15 | imgMat=ones(200,1195,3); 16 | imshow(imgMat,'parent',hAxes); 17 | hold on; 18 | for ii=1:52 19 | fill([23*(ii-1) 23*(ii-1) 23*ii 23*ii],[200 200 200 200]-[0 150 150 0],'w'); 20 | end 21 | for ii=0:6 22 | fill([64+ii*161 64+ii*161 74+ii*161 74+ii*161],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 23 | fill([87+ii*161 87+ii*161 97+ii*161 97+ii*161],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 24 | fill([133+ii*161 133+ii*161 143+ii*161 143+ii*161],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 25 | fill([156+ii*161 156+ii*161 166+ii*161 166+ii*161],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 26 | fill([179+ii*161 179+ii*161 189+ii*161 189+ii*161],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 27 | end 28 | fill([18 18 28 28],[200 200 200 200]-[51 150 150 51],'k','edgealpha',0); 29 | end 30 | 31 | function KeyPressFunction(~,~,~) 32 | currentCharacter=get(hFigure,'currentcharacter'); 33 | if ~any(currentCharacter==key) 34 | key=[key currentCharacter]; 35 | StartPlaying(key(end)); 36 | end 37 | end 38 | 39 | function KeyReleaseFunction(~,~) 40 | currentCharacter=get(hFigure,'currentcharacter'); 41 | StopPlaying(currentCharacter); 42 | key=strrep(key,currentCharacter,''); 43 | end 44 | 45 | function audioPlayerCell=ConstructAudioPlayer(y,Fs) 46 | for id=1:88 47 | audioPlayerCell{id}=audioplayer(y(20000:end),Fs*2^(-19/6+1/12*(id-1))); 48 | end 49 | end 50 | 51 | function StartPlaying(note) 52 | if isempty(note) 53 | return; 54 | end 55 | switch note 56 | case 'z' 57 | play(audioPlayerCell{29});Deepen(29); 58 | case 'x' 59 | play(audioPlayerCell{30});Deepen(30); 60 | case 'c' 61 | play(audioPlayerCell{31});Deepen(31); 62 | case 'v' 63 | play(audioPlayerCell{32});Deepen(32); 64 | case 'b' 65 | play(audioPlayerCell{33});Deepen(33); 66 | case 'n' 67 | play(audioPlayerCell{34});Deepen(34); 68 | case 'm' 69 | play(audioPlayerCell{35});Deepen(35); 70 | case char(44) 71 | play(audioPlayerCell{36});Deepen(36); 72 | case char(46) 73 | play(audioPlayerCell{37});Deepen(37); 74 | case char(47) 75 | play(audioPlayerCell{38});Deepen(38); 76 | case '1' 77 | play(audioPlayerCell{39});Deepen(39); 78 | case '2' 79 | play(audioPlayerCell{40});Deepen(40); 80 | case '3' 81 | play(audioPlayerCell{41});Deepen(41); 82 | case '4' 83 | play(audioPlayerCell{42});Deepen(42); 84 | case '5' 85 | play(audioPlayerCell{43});Deepen(43); 86 | case '6' 87 | play(audioPlayerCell{44});Deepen(44); 88 | case '7' 89 | play(audioPlayerCell{45});Deepen(45); 90 | case '8' 91 | play(audioPlayerCell{46});Deepen(46); 92 | case '9' 93 | play(audioPlayerCell{47});Deepen(47); 94 | case '0' 95 | play(audioPlayerCell{48});Deepen(48); 96 | case char(45) 97 | play(audioPlayerCell{49});Deepen(49); 98 | case char(61) 99 | play(audioPlayerCell{50});Deepen(50); 100 | case 'q' 101 | play(audioPlayerCell{51});Deepen(51); 102 | case 'w' 103 | play(audioPlayerCell{52});Deepen(52); 104 | case 'e' 105 | play(audioPlayerCell{53});Deepen(53); 106 | case 'r' 107 | play(audioPlayerCell{54});Deepen(54); 108 | case 't' 109 | play(audioPlayerCell{55});Deepen(55); 110 | case 'y' 111 | play(audioPlayerCell{56});Deepen(56); 112 | case 'u' 113 | play(audioPlayerCell{57});Deepen(57); 114 | case 'i' 115 | play(audioPlayerCell{58});Deepen(58); 116 | case 'o' 117 | play(audioPlayerCell{59});Deepen(59); 118 | case 'p' 119 | play(audioPlayerCell{60});Deepen(60); 120 | case char(91) 121 | play(audioPlayerCell{61});Deepen(61); 122 | case char(93) 123 | play(audioPlayerCell{62});Deepen(62); 124 | end 125 | end 126 | 127 | function StopPlaying(note) 128 | switch note 129 | case 'z' 130 | stop(audioPlayerCell{29});Undeepen(29); 131 | case 'x' 132 | stop(audioPlayerCell{30});Undeepen(30); 133 | case 'c' 134 | stop(audioPlayerCell{31});Undeepen(31); 135 | case 'v' 136 | stop(audioPlayerCell{32});Undeepen(32); 137 | case 'b' 138 | stop(audioPlayerCell{33});Undeepen(33); 139 | case 'n' 140 | stop(audioPlayerCell{34});Undeepen(34); 141 | case 'm' 142 | stop(audioPlayerCell{35});Undeepen(35); 143 | case char(44) 144 | stop(audioPlayerCell{36});Undeepen(36); 145 | case char(46) 146 | stop(audioPlayerCell{37});Undeepen(37); 147 | case char(47) 148 | stop(audioPlayerCell{38});Undeepen(38); 149 | case '1' 150 | stop(audioPlayerCell{39});Undeepen(39); 151 | case '2' 152 | stop(audioPlayerCell{40});Undeepen(40); 153 | case '3' 154 | stop(audioPlayerCell{41});Undeepen(41); 155 | case '4' 156 | stop(audioPlayerCell{42});Undeepen(42); 157 | case '5' 158 | stop(audioPlayerCell{43});Undeepen(43); 159 | case '6' 160 | stop(audioPlayerCell{44});Undeepen(44); 161 | case '7' 162 | stop(audioPlayerCell{45});Undeepen(45); 163 | case '8' 164 | stop(audioPlayerCell{46});Undeepen(46); 165 | case '9' 166 | stop(audioPlayerCell{47});Undeepen(47); 167 | case '0' 168 | stop(audioPlayerCell{48});Undeepen(48); 169 | case char(45) 170 | stop(audioPlayerCell{49});Undeepen(49); 171 | case char(61) 172 | stop(audioPlayerCell{50});Undeepen(50); 173 | case 'q' 174 | stop(audioPlayerCell{51});Undeepen(51); 175 | case 'w' 176 | stop(audioPlayerCell{52});Undeepen(52); 177 | case 'e' 178 | stop(audioPlayerCell{53});Undeepen(53); 179 | case 'r' 180 | stop(audioPlayerCell{54});Undeepen(54); 181 | case 't' 182 | stop(audioPlayerCell{55});Undeepen(55); 183 | case 'y' 184 | stop(audioPlayerCell{56});Undeepen(56); 185 | case 'u' 186 | stop(audioPlayerCell{57});Undeepen(57); 187 | case 'i' 188 | stop(audioPlayerCell{58});Undeepen(58); 189 | case 'o' 190 | stop(audioPlayerCell{59});Undeepen(59); 191 | case 'p' 192 | stop(audioPlayerCell{60});Undeepen(60); 193 | case char(91) 194 | stop(audioPlayerCell{61});Undeepen(61); 195 | case char(93) 196 | stop(audioPlayerCell{62});Undeepen(62); 197 | end 198 | end 199 | 200 | function Deepen(id) 201 | pos=location(id); 202 | fill([pos-5 pos-5 pos+5 pos+5],[49 44 44 49],'r','edgealpha',0); 203 | end 204 | 205 | function Undeepen(id) 206 | pos=location(id); 207 | fill([pos-5 pos-5 pos+5 pos+5],[49 44 44 49],'w','edgealpha',0); 208 | end 209 | 210 | function pos=location(id) 211 | iPos=mod((id-27),12); 212 | oPos=floor((id-27)/12); 213 | temp=[11.5 23 34.5 46 57.5 80.5 92 103.5 115 126.5 138 149.5]; 214 | pos=oPos*161+368+temp(iPos+1); 215 | end 216 | 217 | end -------------------------------------------------------------------------------- /standardNote.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Shaobin-Jiang/Piano-in-MATLAB/877dd4a65383b09963de0cee2945763164ffb4d5/standardNote.mat --------------------------------------------------------------------------------