Advertisement
Guest User

Untitled

a guest
Aug 17th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.22 KB | None | 0 0
  1. import 'dart:io';
  2.  
  3. abstract class TabNode {}
  4.  
  5. enum TabType {
  6. BASS,
  7. GUITAR,
  8. }
  9.  
  10. // TODO
  11. enum NoteLetter {
  12. E,
  13. F,
  14. G,
  15. A,
  16. B,
  17. C,
  18. D,
  19. }
  20.  
  21. class Note {
  22. NoteLetter letter;
  23. bool sharp;
  24.  
  25. Note({this.letter, this.sharp});
  26. }
  27.  
  28. class HammerOnEvent extends FretEvent {
  29. int fromFret;
  30. int toFret;
  31. int delta;
  32. HammerOnEvent({this.fromFret, this.toFret, this.delta});
  33. }
  34.  
  35. class SlideEvent extends FretEvent {
  36. int fromFret;
  37. int toFret;
  38. int delta;
  39. SlideEvent({this.fromFret, this.toFret, this.delta});
  40. }
  41.  
  42. class NoteFretEvent extends FretEvent {
  43. int fret;
  44. int delta;
  45. NoteFretEvent({this.fret, this.delta});
  46. }
  47.  
  48. class FretEvent {
  49. int delta;
  50. }
  51.  
  52. class NewFretEvent {
  53. int offset = -1;
  54. int index;
  55. EventType type;
  56. List<String> bits = List();
  57. List<int> frets = List();
  58. NewFretEvent();
  59. }
  60.  
  61. class SingleString {
  62. String note;
  63. List<NewFretEvent> events;
  64. SingleString({this.events, this.note});
  65. }
  66.  
  67. abstract class TabElement {}
  68.  
  69. class SingleTabulatureElement extends TabElement {
  70. TabType type;
  71. int length;
  72. List<SingleString> strings;
  73.  
  74. SingleTabulatureElement({this.type, this.length, this.strings});
  75. }
  76.  
  77. enum EventType {
  78. HAMMER_ON,
  79. SLIDE,
  80. SINGLE_NOTE,
  81. SEPARATOR,
  82. STRING_IDENTIFIER,
  83. SPACE,
  84. VIRBRATO,
  85. DEAD_NOTE,
  86. SLIDE_UP,
  87. SLIDE_DOWN,
  88. PULL_OFF,
  89. TEXT,
  90. }
  91.  
  92. class Single {}
  93.  
  94. class TextTabElement extends TabElement {
  95. String content;
  96.  
  97. TextTabElement({this.content});
  98. }
  99.  
  100. enum LineParseResult {
  101. TAB,
  102. TEXT,
  103. }
  104.  
  105. class EventsParser {
  106. final String stringText;
  107.  
  108. EventsParser({this.stringText});
  109.  
  110. String noteIdentifier;
  111. int parseIndex = 0;
  112. List<NewFretEvent> events = List();
  113. NewFretEvent currentFretEvent;
  114.  
  115. List<NewFretEvent> parseEvents() {
  116. while (parseIndex < stringText.length) {
  117. parseEvent();
  118. currentFretEvent.offset = parseIndex - 1;
  119.  
  120. events.add(currentFretEvent);
  121. currentFretEvent = null;
  122. }
  123. return events.where((e) => e != null && e.type != null).toList();
  124. }
  125.  
  126. void parseEvent() {
  127. print("index: " + parseIndex.toString());
  128. if (parseIndex >= stringText.length) return;
  129. if (currentFretEvent == null) {
  130. currentFretEvent = NewFretEvent();
  131. }
  132.  
  133. if ((events.isEmpty ||
  134. (!(events.last.type == EventType.TEXT &&
  135. (parseIndex == stringText.length ||
  136. stringText[parseIndex + 1] != '-')))) &&
  137. isANumbericInteger(stringText[parseIndex])) {
  138. if (currentFretEvent.type == null)
  139. currentFretEvent.type = EventType.SINGLE_NOTE;
  140. var number = parseNumber(stringText, parseIndex);
  141. print(number);
  142. print(stringText[parseIndex]);
  143. print(stringText[parseIndex + number.toString().length]);
  144. parseIndex += number.toString().length;
  145. currentFretEvent.frets.add(number);
  146. print("from number");
  147. parseEvent();
  148. } else {
  149. print(stringText[parseIndex]);
  150. if (stringText[parseIndex] == '|') {
  151. if (currentFretEvent.type != null) finishEvent();
  152. currentFretEvent.type = EventType.SEPARATOR;
  153. parseIndex += 1;
  154. return;
  155. } else if (stringText[parseIndex] == '-') {
  156. if (currentFretEvent.type != null) finishEvent();
  157.  
  158. currentFretEvent.type = EventType.SPACE;
  159. parseIndex += 1;
  160. return;
  161. }
  162.  
  163. if (currentFretEvent.frets.isNotEmpty) {
  164. if (stringText[parseIndex] == 'h') {
  165. currentFretEvent.type = EventType.HAMMER_ON;
  166. parseIndex += 1;
  167. parseEvent();
  168. } else if (stringText[parseIndex] == 's') {
  169. currentFretEvent.type = EventType.SLIDE;
  170.  
  171. parseIndex += 1;
  172. parseEvent();
  173. } else if (stringText[parseIndex] == 'p') {
  174. currentFretEvent.type = EventType.PULL_OFF;
  175. parseIndex += 1;
  176. parseEvent();
  177. } else if (stringText[parseIndex] == '/') {
  178. currentFretEvent.type = EventType.SLIDE;
  179. print("from slide");
  180. parseIndex += 1;
  181. parseEvent();
  182. } else if (stringText[parseIndex] == '\\') {
  183. currentFretEvent.type = EventType.SLIDE;
  184. parseIndex += 1;
  185. parseEvent();
  186. }
  187. } else {
  188. if (stringText[parseIndex] == '/') {
  189. currentFretEvent.type = EventType.SLIDE;
  190. print("from slide");
  191. parseIndex += 1;
  192. parseEvent();
  193. } else if (stringText[parseIndex] == '\\') {
  194. currentFretEvent.type = EventType.SLIDE;
  195. parseIndex += 1;
  196. parseEvent();
  197. } else if (stringText[parseIndex] == 'x') {
  198. currentFretEvent.type = EventType.DEAD_NOTE;
  199. parseIndex += 1;
  200. parseEvent();
  201. } else {
  202. if (parseIndex == 0) {
  203. currentFretEvent.type = EventType.STRING_IDENTIFIER;
  204. currentFretEvent.bits.add(stringText[parseIndex]);
  205. parseIndex += 1;
  206. } else {
  207. currentFretEvent.type = EventType.TEXT;
  208. currentFretEvent.bits.add(stringText[parseIndex]);
  209. parseIndex += 1;
  210. }
  211. }
  212. }
  213. }
  214. }
  215.  
  216. void finishEvent() {
  217. if (currentFretEvent != null) {
  218. currentFretEvent.offset = parseIndex - 1;
  219. events.add(currentFretEvent);
  220. }
  221. currentFretEvent = NewFretEvent();
  222. }
  223.  
  224. int parseNumber(String sequence, int currentIndex) {
  225. var number = int.parse(sequence[currentIndex]);
  226. var numString = number.toString();
  227. if ((currentIndex + 1) < sequence.length) {
  228. if (isANumbericInteger(sequence[currentIndex + 1]) && number < 2) {
  229. numString += parseNumber(sequence, currentIndex + 1).toString();
  230. }
  231. }
  232. return int.parse(numString);
  233. }
  234. }
  235.  
  236. class TabulatureParser {
  237. File activeFile;
  238. int currentLineIndex = 0;
  239. SingleTabulatureElement currentTab;
  240. LineParseResult lastParseResult;
  241. List<String> lines;
  242. List<TabElement> elements = List();
  243.  
  244. TabulatureParser();
  245.  
  246. Future<List<TabElement>> parseFile(File file) async {
  247. lines = await file.readAsLines();
  248. while (currentLineIndex < lines.length) {
  249. readLine();
  250. }
  251. return elements;
  252. }
  253.  
  254. void readLine() {
  255. var line = lines[currentLineIndex];
  256. var events = EventsParser(stringText: line).parseEvents();
  257. events.forEach((e) {
  258. print(e.type);
  259. });
  260. var verifyLineElements =
  261. events.where((e) => e.type != EventType.SPACE).toList();
  262. if (verifyLineElements[0].type == EventType.STRING_IDENTIFIER &&
  263. verifyLineElements[1].type == EventType.SEPARATOR) {
  264. print("TAB");
  265. } else {
  266. print("TEXT");
  267. }
  268.  
  269. currentLineIndex += 1;
  270. }
  271.  
  272. /*
  273. if (line.length > 0 && line[1] == '|') {
  274. if (lastParseResult != LineParseResult.TAB && currentTab != null) {
  275. elements.add(currentTab);
  276. currentTab = null;
  277. }
  278. // print('Found string ${line[0]}');
  279.  
  280. var currentStringParseIndex = 0;
  281. List<FretEvent> events = List();
  282. var eventDelta = 0;
  283. var started = false;
  284. var startIndex;
  285. var endIndex;
  286.  
  287. var eventStarted = false;
  288. List<String> eventBits = [];
  289.  
  290. while (currentStringParseIndex < line.length) {
  291. var events = EventsParser(stringText: line).parseEvents();
  292. var verifyLineElements = events.where((e) => e.type != EventType.SPACE).toList();
  293. if (verifyLineElements[0].type == EventType.STRING_IDENTIFIER && verifyLineElements[1].type == EventType.SEPARATOR) {
  294.  
  295. }
  296. /*
  297. while (currentStringParseIndex < line.length) {
  298. if (line[currentStringParseIndex] == '|' &&
  299. line[currentStringParseIndex - 1] != '-') {
  300. started = !started;
  301. if (started) {
  302. startIndex = currentStringParseIndex;
  303. } else {
  304. endIndex = currentStringParseIndex;
  305. }
  306. currentStringParseIndex += 1;
  307. } else if (line[currentStringParseIndex] == '-') {
  308. if (started) eventDelta += 1;
  309. currentStringParseIndex += 1;
  310. } else {
  311. if (isANumbericInteger(line[currentStringParseIndex])) {
  312. var number = parseNumber(line, currentStringParseIndex);
  313. currentStringParseIndex += number.toString().length;
  314.  
  315. // 🥖 ayy
  316. if (line[currentStringParseIndex] == 'h') {
  317. currentStringParseIndex += 1;
  318. // HAMMERR ON
  319. var nextNum = parseNumber(line, currentStringParseIndex);
  320. currentStringParseIndex += nextNum.toString().length;
  321. events.add(
  322. HammerOnEvent(
  323. fromFret: number,
  324. toFret: number,
  325. delta: eventDelta,
  326. ),
  327. );
  328. } else if (line[currentStringParseIndex] == '/') {
  329. // SLIDEE
  330. currentStringParseIndex += 1;
  331. var nextNum = parseNumber(line, currentStringParseIndex);
  332. currentStringParseIndex += nextNum.toString().length;
  333. events.add(
  334. SlideEvent(
  335. fromFret: number,
  336. toFret: number,
  337. delta: eventDelta,
  338. ),
  339. );
  340. } else {
  341. events.add(
  342. NoteFretEvent(
  343. fret: number,
  344. delta: eventDelta,
  345. ),
  346. );
  347. }
  348. eventDelta = 0;
  349. } else {
  350. if (started) eventDelta += 1;
  351. currentStringParseIndex += 1;
  352. }
  353. }
  354. }
  355.  
  356. if (endIndex == null) {
  357. endIndex = line.length;
  358. }
  359.  
  360. if (currentTab == null) {
  361. currentTab = SingleTabulatureElement(
  362. length: endIndex - startIndex,
  363. strings: [],
  364. );
  365. }
  366.  
  367. currentTab.strings.add(
  368. SingleString(
  369. note: line[0],
  370. events: events,
  371. ),
  372. );
  373.  
  374. lastParseResult = LineParseResult.TAB;
  375.  
  376. if (currentLineIndex + 1 == lines.length ||
  377. !(lines[currentLineIndex + 1].length > 0 &&
  378. lines[currentLineIndex + 1][1] == '|')) {
  379. elements.add(currentTab);
  380. currentTab = null;
  381. }
  382. } else {
  383. elements.add(TextTabElement(
  384. content: line,
  385. ));
  386. lastParseResult = LineParseResult.TEXT;
  387. }
  388. */
  389. }
  390. currentLineIndex += 1;
  391. }*/
  392.  
  393. int parseNumber(String sequence, int currentIndex) {
  394. var number = int.parse(sequence[currentIndex]);
  395. var numString = number.toString();
  396. if (isANumbericInteger(sequence[currentIndex + 1]) && number < 2) {
  397. numString += parseNumber(sequence, currentIndex + 1).toString();
  398. }
  399. return int.parse(numString);
  400. }
  401. }
  402.  
  403. void main(List<String> args) async {
  404. var file = File('tab.txt');
  405. var res = await TabulatureParser().parseFile(file);
  406. res.forEach((e) {
  407. if (e is SingleTabulatureElement) {
  408. print(e.strings.map((e) => e.note).join(', '));
  409. } else if (e is TextTabElement) {
  410. print(e.content);
  411. }
  412. });
  413. }
  414.  
  415. bool isANumbericInteger(String s) {
  416. if (s == null) {
  417. return false;
  418. }
  419. try {
  420. return int.parse(s) != null;
  421. } catch (e) {
  422. return false;
  423. }
  424. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement