| 
									
										
										
										
											2022-02-14 22:12:20 -05:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Furnace Tracker - multi-system chiptune tracker | 
					
						
							| 
									
										
										
										
											2023-01-19 19:18:40 -05:00
										 |  |  |  * Copyright (C) 2021-2023 tildearrow and contributors | 
					
						
							| 
									
										
										
										
											2022-02-14 22:12:20 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation; either version 2 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License along | 
					
						
							|  |  |  |  * with this program; if not, write to the Free Software Foundation, Inc., | 
					
						
							|  |  |  |  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-16 23:21:27 -05:00
										 |  |  | #include "safeReader.h"
 | 
					
						
							| 
									
										
										
										
											2022-08-16 04:19:16 -04:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2022-01-16 23:21:27 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-11 16:08:08 -04:00
										 |  |  | struct DivPattern { | 
					
						
							| 
									
										
										
										
											2022-02-19 02:52:53 -05:00
										 |  |  |   String name; | 
					
						
							| 
									
										
										
										
											2022-12-09 00:30:27 -05:00
										 |  |  |   short data[DIV_MAX_ROWS][DIV_MAX_COLS]; | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-27 02:23:54 -04:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * clear the pattern. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   void clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * copy this pattern to another. | 
					
						
							|  |  |  |    * @param dest the destination pattern. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2022-02-19 02:52:53 -05:00
										 |  |  |   void copyOn(DivPattern* dest); | 
					
						
							| 
									
										
										
										
											2021-12-09 01:44:40 -05:00
										 |  |  |   DivPattern(); | 
					
						
							| 
									
										
										
										
											2021-05-11 16:08:08 -04:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct DivChannelData { | 
					
						
							| 
									
										
										
										
											2022-04-27 18:53:55 -04:00
										 |  |  |   unsigned char effectCols; | 
					
						
							| 
									
										
										
										
											2021-05-11 16:08:08 -04:00
										 |  |  |   // data goes as follows: data[ROW][TYPE]
 | 
					
						
							|  |  |  |   // TYPE is:
 | 
					
						
							|  |  |  |   // 0: note
 | 
					
						
							|  |  |  |   // 1: octave
 | 
					
						
							|  |  |  |   // 2: instrument
 | 
					
						
							|  |  |  |   // 3: volume
 | 
					
						
							|  |  |  |   // 4-5+: effect/effect value
 | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  |   // do NOT access directly unless you know what you're doing!
 | 
					
						
							| 
									
										
										
										
											2022-12-09 00:30:27 -05:00
										 |  |  |   DivPattern* data[DIV_MAX_PATTERNS]; | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * get a pattern from this channel, or the empty pattern if not initialized. | 
					
						
							|  |  |  |    * @param index the pattern ID. | 
					
						
							|  |  |  |    * @param create whether to initialize a new pattern if not init'ed. always use true if you're going to modify it! | 
					
						
							|  |  |  |    * @return a DivPattern. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2021-12-09 01:44:40 -05:00
										 |  |  |   DivPattern* getPattern(int index, bool create); | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 04:19:16 -04:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * optimize pattern data. | 
					
						
							|  |  |  |    * not thread-safe! use a mutex! | 
					
						
							|  |  |  |    * @return a list of From -> To pairs | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   std::vector<std::pair<int,int>> optimize(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * re-arrange NULLs. | 
					
						
							|  |  |  |    * not thread-safe! use a mutex! | 
					
						
							|  |  |  |    * @return a list of From -> To pairs | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   std::vector<std::pair<int,int>> rearrange(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-15 23:05:55 -04:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * destroy all patterns on this DivChannelData. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2021-12-15 17:32:08 -05:00
										 |  |  |   void wipePatterns(); | 
					
						
							| 
									
										
										
										
											2021-12-09 01:44:40 -05:00
										 |  |  |   DivChannelData(); | 
					
						
							| 
									
										
										
										
											2021-05-11 16:26:38 -04:00
										 |  |  | }; |