Re: Using MapAt with Play
- To: mathgroup at smc.vnet.net
- Subject: [mg113873] Re: Using MapAt with Play
- From: BenT <brtubb at pdmusic.org>
- Date: Tue, 16 Nov 2010 06:14:26 -0500 (EST)
- References: <ibr391$8vi$1@smc.vnet.net> <ibtku8$5gt$1@smc.vnet.net>
On Nov 16, 4:03 am, Albert Retey <a... at gmx-topmail.de> wrote:
> Am 15.11.2010 11:50, schrieb BenT:
>
>
>
>
>
> > Using Mathematica 7, please consider this code:
>
> > Play[{Sin[440 t 2 Pi], Sin[441 t 2 Pi]}, {t, 0, 1},
> > SampleRate -> 44100, SampleDepth -> 16]
>
> > which works as intended.
>
> > But now attempting to use the MapAt function,
>
> > p = {440, 550, 660, 770, 880};
> > Play[{Sin[# t 2 Pi], Sin[(# + 1) t 2 Pi] &} /@ p, {t, 0, 1},
> > SampleRate -> 44100, SampleDepth -> 16]
>
> > I get the following error coding:
>
> > During evaluation of In[28]:= Sound::ssnm: A good PlayRange could not
> > be found since most of the samples are not evaluating to machine-size
> > real numbers. >>
>
> > Out[28]= Sound[
> > SampledSoundFunction[
> > Function[{Play`Time37},
> > Block[{t =
> > 0. + 0.0000226757 Play`Time37}, ({Sin[#1 t 2 \[Pi]],
> > Sin[(#1 + 1) t 2 \[Pi]] &} /@ p + 0.) 1.]],
> > 44100, {44100, 16}]]
>
> > Can anyone tell me how to "correct" the problem? The intent is to
> > "automate" the playback of several "paired" pitches.
>
> There seem to be three problems with your code:
> 1) the pure function termination is at the wrong place
> 2) Play doesn't like the list of list, so I Flatten the resulting list
> of lists
> 3) Play has attribute HoldAll, so we need to Evaluate to enforce the
> evaluation.
>
> Honestly my impression is that Play has some problems handling input
> that it doesn't accept, my Kernel died a few times when experimenting
> with it...
>
> The follwing works, although I doubt it does what you intended (it plays
> on 10 channels.):
>
> p = {440, 550, 660, 770, 880};
>
> Play[
> Evaluate[Flatten[{Sin[# t 2 Pi], Sin[(# + 1) t 2 Pi]} & /@ p]],
> {t, 0, 1}, SampleRate -> 44100, SampleDepth -> 16
> ]
>
> Maybe this is closer to what you want? It adds up the signals instead of
> playing them on different channels...
>
> Play[
> Evaluate[
> Plus @@ Flatten[{Sin[# t 2 Pi], Sin[(# + 1) t 2 Pi]} & /@ p]],
> {t, 0, 1}, SampleRate -> 44100, SampleDepth -> 16
> ]
>
> hth,
>
> albert- Hide quoted text -
>
> - Show quoted text -
No, I want consecutive note playback for one second _each_, not
simulataneous. The use of two of more channels is not important.
Summing works fine, as the effect I want is an example of chorusing.
For example (although this code _still_ doesn't work!):
p = {440, 550, 660, 770, 880};
Play[{N[Sin[# t 2 Pi] + Sin[(# + 1) t 2 Pi]]} & /@ p, {t, 0, 1},
SampleRate -> 44100, SampleDepth -> 16]
I'm (still) getting the error:
Sound::ssnm: A good PlayRange could not be found since most of the
samples are not evaluating to machine-size real numbers. >>
What can be done to correct this?