Guest User

Untitled

a guest
Jan 16th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. #!/usr/bin/perl -s
  2.  
  3. BEGIN
  4. {
  5.  
  6. $usage = <<" DONE"
  7. Usage:
  8. $0 [-h] [-ms] [-ts=FRACTION] INTEGER [INTEGER ...]
  9. -h
  10. Display this help message.
  11. -ms
  12. Display timings in milliseconds.
  13. Default is to use seconds instead.
  14. -ts=FRACTION
  15. Specify a time signature with FRACTION, i.e. 6/8, 4/2.
  16. Default is 4/4.
  17. INTEGER
  18. Number of beats per minute.
  19. Example: $0 -ts=3/4 96
  20. DONE
  21. ;
  22.  
  23. if($h) #user wants help
  24. {
  25. print($usage);
  26. exit(0);
  27. } #end if
  28.  
  29. if(!@ARGV)
  30. {
  31. warn("!No arguments given.\n${usage}");
  32. exit(1);
  33. } #end
  34.  
  35. sub positive_integer($)
  36. {
  37. $_[0] > 0 and $_[0] eq int $_[0];
  38. } #end sub
  39.  
  40. if($ms) #milliseconds switch
  41. {
  42. $main::time_factor = 60_000; #milliseconds per minute
  43. $main::time_unit = 'ms';
  44. } #end if
  45. else
  46. {
  47. $main::time_factor = 60; #seconds per minute
  48. $main::time_unit = 's';
  49. } #end else
  50.  
  51. if($ts) #time signature switch
  52. {
  53. my($numerator, $denominator) = split('/', $ts);
  54. if(positive_integer($numerator) && positive_integer($denominator))
  55. {
  56. $main::beats_per_bar = $numerator;
  57. $main::note_value = $denominator;
  58. } #end if:if
  59. else
  60. {
  61. warn(qq/!:Invalid time signature: ${ts}\n${usage}"/);
  62. exit(2);
  63. } # end if:else
  64. } #end if
  65. else
  66. {
  67. $main::beats_per_bar = 4;
  68. $main::note_value = 4;
  69. } #end else
  70.  
  71. sub beat_length($)
  72. {
  73. $time_factor * 4/$note_value / $_[0];
  74. } #end sub
  75. sub bar_length($)
  76. {
  77. $beats_per_bar * beat_length($_[0]);
  78. } #end sub
  79.  
  80. } #end BEGIN
  81.  
  82.  
  83. ### Main program ###
  84.  
  85. foreach $beats_per_minute(@ARGV)
  86. {
  87. if(positive_integer($beats_per_minute))
  88. {
  89. printf
  90. (
  91. "%sBPM: beat = %g %s, bar = %g %s\n",
  92. $beats_per_minute,
  93. beat_length($beats_per_minute), $time_unit,
  94. bar_length($beats_per_minute), $time_unit
  95. );
  96. } #end foreach:if
  97. else
  98. {
  99. warn("!Not a positive integer: ${beats_per_minute}\n${usage}");
  100. } #end foreach:else
  101. } #end foreach
  102.  
  103. ### End of main program ###
Add Comment
Please, Sign In to add comment