#!/usr/bin/perl sub usage { print <[....][s|k][+][/] [] The first argument gives the 'level' and 'type' of the programme to run. The digits 00 to 99 select the level, based on carrier frequencies from 200Hz (00) down to 2Hz (99). The idea is to work from level 00 to 99, waiting for each to become 'boring' before moving on. (In theory, the whole set could take several years to work through.) Later levels require headphones that can reproduce really deep bass frequencies, ideally down to 10Hz or lower. I'm currently using Sony MDR-EX70LP earphones which in theory go down to 6Hz, and which I am very happy to recommend. (Note that the following model, the MDR-EX71SL, gives very poor quality sound by comparison.) Also, you might wish to jump right in at the 20-30 range; this is where Centerpointe start their programme. If you want to fine-tune the level, you can include a decimal point (e.g. 20.5a for halfway between 20a and 21a). The letter a-l (or A-L if you prefer) selects the beat frequencies. Beat frequencies always start at 10Hz, and then drop exponentially to a target, which is as follows for letters A-L: 4.4, 3.7, 3.1, 2.5, 2.0, 1.5, 1.2, 0.9, 0.7, 0.5, 0.4, 0.3. Using A, you never get down to delta frequencies. Deeper beats (i.e. later letters) are supposed to be better, so long as you really are entraining to them. Like the carriers, this is something to build up over time. The optional letter 's' following indicates that frequencies should slide rather than being stepped. Sliding gives a more general experience, without giving the brain the opportunity to sync precisely with any one frequency for any significant period of time. In my experience, this can feel smoother and more natural. I'm still experimenting with this, though. Stepped frequencies (the default) can sometimes give separate 3-minute dream scenes as different frequencies are stimulated, which you won't get with sliding tones. Since they hold you at a particular frequency, you can potentially go deeper into it. The optional letter 'k' indicates a super-stepped change -- using changes at 1 minute intervals instead of 3 minute intervals. This is experimental; it may give a more intense session than the default settings. The optional '+' indicates a 60-minute programme rather than a 30-minute one. The extra 30 minutes keeps you at the final beat frequency for the whole time, although carrier changes are spread over the whole 60 minutes. The optional '/' lets you increase the amplitude of the waves if necessary. For example, you may need to boost it to compensate for the poor low-frequency response of your headphone or amp or whatever, especially for the very low carrier frequencies in later levels. Note that the Centrepointe entry-level CD corresponds very roughly to 29d+, and the demo on their site to 58a (i.e. an advanced level, but not going too deep). They appear to use stepped beat frequencies. Please consider joining the sbagen-users mailing list if you want to discuss using this script. See http://uazu.net/sbagen/ for the link. BIG LEGAL NOTE and DISCLAIMER: If you use this script, you do so AT YOUR OWN RISK. Whilst this script generates binaural beats that I hope are roughly similar in effect to those used by Centerpointe (by dropping the carrier frequency in stages, for instance), I have not made any attempt to reproduce their binaural frequencies exactly. Also, there is a lot more to the Centerpointe programme CDs than just the binaural beats. The soundtracks contain rain and water sounds and also resonating bell sounds that I'm sure have significant additional effects, and there are also unexplained low frequency tones at places on these CDs. In addition Centerpointe provides a strong support system that keeps people motivated and helps them through any difficulties they may have using the programme. Their CDs have been fully tested by thousands of people over years, whilst this script is relatively untested at present. So, really, this is intended only for experimenters who use it at their own risk. People who require a fully tested, supported and packaged solution should go and give Centerpointe some money: http://www.centerpointe.com/links.cfm?ad=27103 END OF BIG LEGAL NOTE EOT exit 1; } # Features when stepping: # Using all beat target codes from D-L, 77 different beat frequencies # are stimulated between 0.3 and 8.5Hz, along with 10Hz which is used # on every one. This gives a fair chance that any interesting # frequencies in that range might be stimulated during the sessions. usage() unless (@ARGV); usage() unless ($ARGV[0] =~ /^(\d\d(\.\d+)?)([a-zA-Z])([sk]?)(\+?)(\/([\d.]+))?$/); shift; $carr= 200 - 2 * ($1); $bcod= lc($3); $slide= $4 eq 's'; $n_step= ($4 eq 'k') ? 30 : 10; $long= $5 eq '+'; $amp= ($7 eq '') ? 0.5 : $7; $stepslide= $n_step > 20 ? 5 : 10; # Seconds slide between steps # Carriers $len= $long ? 3600 : 1800; $c0= $carr + 5; $c1= $long ? $carr + 2.5 : $carr; $c2= $carr; sub exp_range { my ($cnt, $b0, $b1)= @_; my $logb0= log($b0); my $logb1= log($b1); my @rv= (); for (0..($cnt-1)) { push @rv, exp($logb0 + ($logb1-$logb0) * $_/($cnt-1)); } return @rv; } # Beats; steps or slides over the frequencies in @beat (however many # there are) over the first 30 minutes, and then holds on the final # frequency for the following 30 minutes, if $long. @beat= (); if ($bcod =~ /[a-l]/) { @target= qw(4.4 3.7 3.1 2.5 2.0 1.5 1.2 0.9 0.7 0.5 0.4 0.3); @beat= exp_range($n_step, 10, $target[ord($bcod) - ord('a')]); } else { usage(); } $steps= @beat; if ($slide) { printf STDERR "Carrier slides from ${c0}Hz to ${c2}Hz\n"; printf STDERR "Beat frequency slides from $beat[0]Hz to $beat[$steps-1]Hz\n"; printf STDERR "\n"; } else { printf STDERR "Carrier steps from ${c0}Hz to ${c2}Hz\n"; printf STDERR "Beat frequency steps from $beat[0]Hz to $beat[$steps-1]Hz:\n"; print STDERR " " . join(" ", map { sprintf("%.2f", $_) } @beat) . "\n"; printf STDERR "\n"; } sub fmt { my $sec= shift; my $min= int($sec / 60); $sec %= 60; my $hour= int($min / 60); $min %= 60; return sprintf("%d:%02d:%02d", $hour, $min, $sec); } @out1= (); @out2= (); push @out1, "off: -"; push @out2, "23:59:55 == off ->"; if ($slide) { # Slide version for (0..($steps-1)) { my $tim= int($_ * 1800 / ($steps-1)); push @out1, sprintf("ts%02d: %g+%g/%s", $_, $c0 + ($c1-$c0) * $tim / 1800.0, $beat[$_], $amp); push @out2, sprintf("%s == ts%02d ->", fmt($tim), $_); } if ($long) { push @out1, "tsend: $c2+$beat[$steps-1]/$amp"; push @out2, "1:00 == tsend ->"; push @out2, "1:00:10 == off"; } else { push @out2, "0:30:10 == off"; } } else { # Step version for (0..($steps-1)) { my $tim0= int($_ * 1800 / $steps); # Period start time my $tim1= int(($_+1) * 1800 / $steps); # Period end time push @out1, sprintf("ts%02d: %g+%g/%s", $_, $c0 + ($c2-$c0) * $tim1/$len, $beat[$_], $amp); push @out2, sprintf("%s == ts%02d ->", fmt($tim0), $_); push @out2, sprintf("%s == ts%02d ->", fmt($tim1 - $stepslide), $_); } if ($long) { for ($steps .. (2*$steps-1)) { my $tim0= int($_ * 1800 / $steps); # Period start time my $tim1= int(($_+1) * 1800 / $steps); # Period end time push @out1, sprintf("ts%02d: %g+%g/%s", $_, $c0 + ($c2-$c0) * $tim1/$len, $beat[$steps-1], $amp); push @out2, sprintf("%s == ts%02d ->", fmt($tim0), $_); push @out2, sprintf("%s == ts%02d ->", fmt($tim1 - $stepslide), $_); } push @out2, sprintf("%s == off", fmt($len)); } else { push @out2, sprintf("%s == off", fmt($len)); } } die unless open OUT, ">tmp-prog"; print OUT <